2013-07-20 10 views
7

私は、次のしている:私はループの途中でコレクションを修正していますので、リストの反復処理中にListを変更することはできますか?

 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 
       } 
      } 

これはかかわらず、機能していません。私の質問は...このタイプのアクセスを許可するコレクションがありますか?

私が既に持っているので、深さカードをToList()にしたくないのですが、は、私が反復しているので、そのリストを変更するにはが必要です。出来ますか?

答えて

18

それはトリックが後方に反復することであり、可能です:

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

あなたはまたList.ForEachを使用することができますfor -loop

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

との後方反復することができます反復でリストを変更することができます:

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

またはあなただけのList.RemoveAllを使用し、条件の項目を削除する場合:

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

は常に前に '結果を絞り込むために'のForEachを(やっ前で '()'ステートメント)を追加することができますその条件付き削除の場合は、それらを削除します。 –

+0

@Bob .:いいえ、それは 'List 'ではなく、 'List.ForEach'メソッドをサポートしていない' IEnumerable 'です。 'foreach'しか使用できませんでしたが、ループ内のリストを変更することはできません。 –

+0

ToList()は何のためのものではありませんか? –

関連する問題