2013-06-05 19 views
30

Sto lavorando a un elenco dinamico di punteggi che viene aggiornato di frequente. In definitiva, questo viene utilizzato per produrre una valutazione generale, quindi è necessario rimuovere le voci meno recenti (basate su alcuni parametri, non il tempo) per evitare una pesatura di +/- pesante sul totale. Aggiungerà più valori contemporaneamente da un'enumerazione separata.Rimuovi ultimi n elementi dall'elenco utilizzando 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 
    } 

Se qualcuno può aiutare sarebbe molto apprezzato :) Ho avuto per rendere il codice un po 'generica perché è scritto piuttosto criptico (non scrivere i metodi).

+3

se avete bisogno di FIFO è possibile utilizzare [Coda ] (http://msdn.microsoft.com/en-us/library/7977ey2c.aspx) al posto di Lista . –

risposta

33

Usa List<T>.RemoveRange - qualcosa di simile:

// 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); 
} 

Si rimuove dall'inizio della lista, perché quando si Add oggetti vanno alla fine - quindi i più vecchi sono all'inizio.

25

Prova questa

scoreList.RemoveAt(scoreList.Count-1); 

E here è l'articolo MSDN

+2

Questo rimuove l'elemento aggiunto più recentemente. OP vuole rimuovere gli elementi più vecchi – Blorgbeard

+0

Nel mio caso, ho solo bisogno di rimuovere l'ultimo elemento, quindi questo funziona perfettamente per me. Grazie. –

1

Non ho capito molto bene la tua domanda, spero se questo è quello che vuoi.

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

Un modo semplice per ottenere ultimi n elementi da un elenco con LINQ

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

Ho giocato intorno e guardato il metodo suggerito in precedenza (scoresList.RemoveAt()), ma non era adatto alla situazione . Che cosa ha fatto finire a lavorare:

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

Grazie per i ragazzi di aiuto

+0

Sembra che rimuoverà i punteggi aggiunti più di recente, non quelli aggiunti meno di recente? – Blorgbeard

7

Invece di utilizzare un List<int> Ti consiglio di utilizzare una Queue<int>. Questo ti darà il comportamento FIFO che stai cercando.

Vedere http://msdn.microsoft.com/en-us/library/7977ey2c.aspx per ulteriori informazioni sulle code.

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(); 
    } 
Problemi correlati