2011-09-11 58 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 -umeumerable-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

由於documentation狀態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); 
} 

副本是不愉快的,當然。在這種特殊情況下,由於您只是添加元素,所以可以通過使用for()循環來避免複製:

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