2013-07-20 11 views
7

Ho il seguente:È possibile modificare un elenco durante l'iterazione attraverso di esso?

 foreach (var depthCard in depthCards) 
      { 
       var card = InternalGetCard(db, depthCard.CardId); 
       var set = InternalGetSet(db, (int)card.ParentSetId); 
       var depthArray = InternalGetDepthArrayForCard(db, set.SetId); 
       foreach (var cardToUpdate in set.Cards) 
       { 
        // do stuff 
        SaveChanges(db); 
        depthCards.Remove(depthCardToUpdate); // since I already took care of it here, remove from depthCards 
       } 
      } 

Questo non funziona, però, perché sto modificando la raccolta nel bel mezzo di un ciclo. La mia domanda è ... c'è qualche tipo di collezione che permette questo tipo di accesso?

Non voglio ToList() the depthCards perché li ho già e io voglio per modificare quell'elenco mentre sto iterando. È possibile?

risposta

18

E 'possibile, il trucco è quello di iterare indietro:

for (int i = depthCards.Count - 1; i >= 0; i--) { 
    if (depthCards[i] == something) { // condition to remove element, if applicable 
    depthCards.RemoveAt(i); 
    } 
} 
7

È possibile scorrere all'indietro con un for -loop

for (int i = depthCards.Count - 1; i >= 0; i--) 
{ 
    depthCards.RemoveAt(i); 
} 

È anche possibile utilizzare List.ForEach che consente di modificare l'elenco su iterazione:

depthCardToUpdate.ForEach(dc => depthCardToUpdate.Remove(dc)); 

o se si desidera solo per rimuovere gli elementi su una condizione, utilizzare List.RemoveAll:

depthCardToUpdate.RemoveAll(dc => conditionHere); 
+0

sempre potuto aggiungere una Dove() istruzione '' prima di fare il 'foreach()' per restringere i risultati prima rimuovendoli, se è una rimozione condizionale. –

+0

@Bob .: No, perché quindi non sarebbe più un 'Elenco ' ma un 'IEnumerable ' che non supporta il metodo 'List.ForEach'. È possibile utilizzare solo 'foreach', quindi non è possibile modificare l'elenco nel ciclo. –

+0

Non è questo il significato di 'ToList()'? –

Problemi correlati