2011-09-11 7 views
0

コレクションに整数のリストを作成し、foreachを使用してループしますが、ループ中にリストにデータを挿入する必要がある場合はどうすればいいですか?私は得ていますコレクションをループする際にコレクションを変更するときにInvalidOperationExceptionが発生する

未処理の例外:System.InvalidOperationException:コレクションは 変更された列挙操作が実行されないことがあります。

これは以下のサンプルコードです。私はAsReadonly()が変更された状態より前のコレクションを返すと考えました。それはここでは当てはまりません。

ints = new List<int>(30); 
ints.AddRange(Enumerable.Range(1, 10)); 
int y = 11; 

foreach(int x in ints.AsReadOnly()) 
{ 
    ints.Add(y++); 
    Console.WriteLine(x); 
} 
+3

:この特定のケースで、あなただけの要素を追加しているので、あなたがのために()ループを使用してコピーを避けることができますか?上に切ったものは何をするのですか?あなたの本当のユースケースが何であるかを理解せずに、あなたに代替アプローチを提案することさえできないので、私は尋ねています。 –

+0

[C#で反復処理している間に列挙可能なコレクションからアイテムを変更または削除する方法](http://stackoverflow.com/questions/308466/how-to-modify-or-delete-items-from-an) -enumerable-collection-while-iterating-throu) – adrianbanks

答えて

1

他で述べたように、AsReadonly()は、元のリストの周りにラッパーを生成します。

このようなものが動作します。しかし、私はあなたが何をしようとしているのか分からないので、役に立たないかもしれません。

var ints = new List<int>(); 
ints.AddRange(Enumerable.Range(1, 10)); 
int y = 11; 

var moreInts = new List<int>(); 

foreach(int x in ints.AsReadOnly()) 
{ 
    moreInts.Add(y++); 
    Console.WriteLine(x); 
} 

ints.AddRange(moreInts); 
0

中にコレクションを変更することはできませんforeachループ。代わりにfor -loopを使用してください。

+0

反復処理しているコレクションを変更することはできません。しかし、別のコレクションを変更すると、Hansがコメントで述べた 'ToArray()'アプローチを可能にします。 – svick

1

AsReadonly()は元のコレクションのラッパーで、まだ同じコレクションで操作しているため、同じ規則が適用されます。

読み取り専用のコレクションは、コレクションの変更を防ぐラッパー のコレクションです。したがって、 が基になるコレクションに変更された場合、読み取り専用コレクションにはこれらの変更が反映されます( )。

+0

これはデコレータではありません - おそらく[ファサード](http://en.wikipedia.org/wiki/Facade_pattern)。 –

+0

@Jonathan:はい、そうです - インタフェースが実際には異なるのでデコレータは適用されません(変更が許可されていないため) – BrokenGlass

0

AsReadOnlyMethod()は、変更を禁止するラッパーリストを返しますが、それでも同じリストです。

2

変更できないリストのコピーを使用する必要があります。これは動作します:

foreach(int x in ints.ToArray()) 
{ 
    ints.Add(y++); 
    Console.WriteLine(x); 
} 

もちろんコピーは不快です。好奇心のうち

int count = ints.Count; 
for (int ix = 0; ix < count; ++ix) { 
    ints.Add(y++); 
    Console.WriteLine(ints[ix]); 
} 
関連する問題