2013-06-05 8 views
30

Ich arbeite an einer dynamischen Liste von Scores, die häufig aktualisiert wird. Letztendlich wird dies verwendet, um eine Gesamtbewertung zu erzeugen, so dass ältere Einträge (basierend auf einigen Parametern, nicht der Zeit) entfernt werden müssen, um eine starke +/- Gewichtung der Gesamtsumme zu verhindern. Es wird mehrere Werte gleichzeitig aus einer separaten Enumeration hinzufügen.Entfernen Sie die letzten n Einträge aus der Liste mit C#

List<int> scoreList = new List<int>(); 

    foreach(Item x in Items) 
    { 
    scoreList.Add(x.score); 
    } 

    //what I need help with: 
    if(scoreList.Count() > (Items.Count() * 3)) 
    { 
     //I need to remove the last set (first in, first out) of values size 
     //Items.Count() from the list 
    } 

Wenn jemand helfen kann, wäre es sehr geschätzt :) Ich hatte den Code ein wenig generisch zu machen, weil es eher kryptisch geschrieben (nicht schreiben die Methoden).

+3

wenn Sie FIFO benötigen Sie können [Queue ] (http://msdn.microsoft.com/en-us/library/7977ey2c.aspx) anstelle von List . –

Antwort

33

Nutzung ist List<T>.RemoveRange - etwa so:

// number to remove is the difference between the current length 
// and the maximum length you want to allow. 
var count = scoreList.Count - (Items.Count() * 3); 
if (count > 0) { 
    // remove that number of items from the start of the list 
    scoreList.RemoveRange(0, count); 
} 

Sie entfernen von Anfang der Liste, denn wenn man Add Gegenstände gehen sie bis zum Ende - so sind die Ältesten am Anfang.

25

Versuchen Sie, diese

scoreList.RemoveAt(scoreList.Count-1); 

Und here der MSDN Artikel

+2

Das entfernt den zuletzt hinzugefügten Artikel. OP möchte die ältesten Artikel entfernen – Blorgbeard

+0

In meinem Fall muss ich nur den letzten Artikel entfernen, so dass dies perfekt für mich funktioniert. Vielen Dank. –

1

Ich habe deine Frage nicht sehr gut verstanden, hoffe, wenn es das ist, was du willst.

scoreList.RemoveRange(Items.Count()*3, scoreList.Count()-Items.Count()*3); 
1

Ein einfacher Weg, letzte n Elemente aus einer Liste mit Linq

 scoreList.Skip(Math.Max(0, scoreList.Count() - N)).Take(N) 
0

Ich spielte um und sah das Verfahren oben vorgeschlagen (scoresList.RemoveAt()) zu bekommen, aber es war nicht auf die Situation geeignet . Was hat am Ende arbeiten:

if (...) 
{ 
    scoresList.RemoveRange(0, scores.Count); 
} 

Vielen Dank für die Hilfe Jungs

+0

Es scheint, als würde das die zuletzt hinzugefügten Scores entfernen, nicht die zuletzt hinzugefügten Scores? – Blorgbeard

7

Statt eine List<int> verwenden würde ich empfehlen, ein Queue<int> verwenden. Dadurch erhalten Sie das FIFO-Verhalten, nach dem Sie suchen.

Weitere Informationen zu Warteschlangen finden Sie unter http://msdn.microsoft.com/en-us/library/7977ey2c.aspx.

Queue<int> scoreList = new Queue<int>(); 

    foreach(Item x in Items) 
    { 
    scoreList.Enqueue(x.score); 
    } 

    //Or you can eliminate the foreach by doing the following 
    //Queue<int> scoreList = new Queue<int>(Items.Select(i => i.score).ToList()); 

    //Note that Count is a property for a Queue 
    while (scoreList.Count > (Items.Count() * 3)) 
    { 
    scoreList.Dequeue(); 
    } 
Verwandte Themen