2011-07-27 17 views
0

可能性の重複実行されないことがあります。
Collection was modified; enumeration operation may not execute - why?コレクションが変更されました。列挙操作が

まずオフをここコンテキストは拡張メソッドを扱うように、私は、これが重複問題はないと考えています。

Extensionメソッドを使用してアイテムをあるリストから別のリストに移動するときにこの例外が発生します。アイテムを削除しているリストが反復処理中のリストではないため、ちょっと混乱します。

例えば、最低でも拡張メソッドは、次のようになります。

public static void MoveItemsTo(this IList source, IList target, IList items) 
{ 
    foreach (var item in items) { 
     target.Add(item); 
     source.Remove(item); 
    } 
} 

これは、このように呼ばれるメソッドです:私がしようとすると、私は唯一のエラーメッセージが表示さ

myCollectionOne.MoveItemsTo(myCollectionTwo, itemsToMove); 

ソースリストから項目を削除してください...これは、メソッドが別のリストを反復しているので、ちょっと混乱します。私が気付いていない場面の後ろで何かが起こっているはずです...

+1

これは拡張メソッドでも違いはありません。 –

+0

これを示す例の3つの引数は何ですか? –

+0

どのようなエラーがありますか?どのような例外ですか? –

答えて

0

通常のforループを使用する代わりに、foreachループを使用します。実際にアイテムリストからアイテムを削除しているのは、それが反復処理を行っているからです。サイドノートでは

for (int i = 0; i < items.Count; i++) 
{ 
    target.Add(item); 
    source.Remove(source[i]); 
} 

それはあなたが達成しようとしているもの確かであれば、あなたはおそらく、のためのループの後に一度に全体のソースリストをクリアすることができます。

0

これは、ソースリストを変更せずに、ソースからデスティネーションへのアイテム移動の結果である新しいリストを返します。これにより、ソースリストを不変リストとして扱うことで、問題のrefence問題を回避します。

void Main() 
{ 
    var a = new List<string>() { "a","b","c" }; 
    var b = new List<string>() { "d" }; 
    var c = a.MoveItemsTo(i=>i=="b",b); 
    c.Dump(); // { "d", "b" } 
} 

public static class Extensions 
{ 
    public static IEnumerable<T> MoveItemsTo<T>(this IEnumerable<T> source, Func<T,bool> Predicate,IEnumerable<T> DestSource) 
    { 
     var newList = new List<T>(DestSource); 
     newList.AddRange(source.Where(Predicate).ToList()); 
     return newList; 
    } 
}