2017-06-09 6 views
0

foreachループ内の観測可能なコレクション '品種'を変更することはできません。 'if'の条件が満たされたときに 'Remove'まだコレクションの大部分が通過するときに存在します。ForEach内の観測可能なコレクションに追加または削除する

品種から削除するのではなく条件が満たされた場合、その品種を新しいリストに追加しますが、初めて条件が満たされるとすぐにforeachが存在するように変更しました。

何か不足していますか?

foreach (Variety variety in varieties) 
{ 
    if (variety.Type != main.Type && variety.Type != null) 
     { 
      varieties.Remove(variety); 
     } 
} 

変更されたコード:

foreach (Variety variety in varieties) 
{ 
    if (variety.Type == main.Type || variety.Type == null) 
     { 
      FilteredVarieties.Add(variety); 
     } 
} 

答えて

0

あなたはforeachの内部のソースコレクションを変更することはできません。本当に変更したい場合は、foreach内でループして内部で変更するコピーを持ってみてください。

var sourcecopy=varieties; 
foreach (Variety variety in sourcecopy) 
{ 
if (variety.Type != main.Type && variety.Type != null) 
    { 
     varieties.Remove(variety); 
    } 
} 
0

あなたはforeachループの中であなたのコレクションから項目を削除することはできません。 foreachと書いているときに起こっていることは、実際にはforループを作成していて、0からコレクションの元の数になるということです。ですから、何かを削除してコレクションの数が変化すると、ループの範囲は更新されません。

通常のforループに切り替えると、うまくいくはずです。

0

他の人(とコンパイラ)が言っているように、あなたはそうした方法で列挙しているコレクションを変更することはできません。ただし、foreachのコレクションの.ToList()コレクションの場合は、実際にはリストのコピーを列挙しているので、元のリストを削除または追加することは自由です。

foreach (Variety variety in varieties.ToList()) 
{ 
    if (variety.Type != main.Type && variety.Type != null) 
    { 
     varieties.Remove(variety); 
    } 
} 
関連する問題