2012-05-09 39 views
-4

你怎麼能最好地解釋爲什麼如果你複製它,使用foreach替換你正在循環的集合的元素是被允許的。例如:爲什麼你不能修改每個循環中的集合

foreach(Item item in Items) 
{ 
    item.modify //or remove or add 
} 
// will not work 

foreach(Item item in Items.ToList()) 
{ 
    item.modify //or remove. or add 
} 

//will work altough i dont get it because i am now iterating trough the temporary list 
//and changing its elements. 
//In my understanding its not like im iterating the list(.ToList) and modifying the source items 
//(Items). A graphic representation would be welcome, my interest is to understand the 
//matter logically 
+2

因爲如果你**榜上無名的副本**然後除去項目*原始列表*(它*不*被重複!)不會影響副本。 – 2012-05-09 06:48:07

+0

您需要找到列表的內部以及項目如何連接在一起,以及迭代器如何從一個元素移動到另一個元素,以瞭解爲什麼會發生這種情況(副本旁邊)。這些列表通過指針連接在一起。從列表中刪除項目時,所有列表都會更改,並且下一個循環中的迭代器不能相同。 – Aristos

+0

如果它使用列表進行迭代,那麼logicaly它將使用相同的列表從中刪除。因爲即時通訊使用列表對象進行此操作。 – Freeman

回答

-1

最佳答案是List對列表項有某種跟蹤,並且可以根據你的要求更新它的項目,但是一個簡單的IEnumerable不會,因此它不會允許你改變它們。

0

因爲Enumerator繼電器在集合中元素的count和你不premitted迭代過程中更改它。

如果您製作列表的副本(回答您的問題),您可以遍歷要更改的集合的副本。那是。

+0

我知道,但如果你做一個ToList()這個時候你不在列表項目上做同樣的操作,但它沒有這樣做的問題。爲什麼? – Freeman

+0

@Freeman:ToList()在列表中創建一個新的**副本**,即。 – Tigran

+0

它是否每次迭代都會創建一個新的副本列表? – Freeman

-1

你的物品是什麼類型?修改方法做了什麼?我無法複製你可以用第二種方法做什麼。我不能編譯如下:

int[] nn = new int[] { 1, 2 }; 
foreach (var n in nn.ToList()) 
    n++; 

錯誤:無法分配給「N」,因爲它是一個「的foreach迭代變量」

+0

我的項目是EntityObject類型。所以在我使用IEnumerable 的集合上IEnumerable 。 – Freeman

相關問題