2016-06-29 33 views
4

對象的列表:迭代我碰到這個聲明是用foreach

「當對象列表上使用的foreach,迭代對象實例編輯,但對象屬性可編輯「

有人可以用一個簡單的例子演示上述嗎?

讓我重新短語(因爲我發現有兩個版本的說法),也許這種說法更明確:

「當使用的foreach元素的列表,迭代變量那提供元件是只讀,但元素屬性是可編輯的

+0

這意味着列表本身不能被修改(當你在循環中時你不能刪除或添加項目),但是列表中項目的屬性可以被修改。另請閱讀http://stackoverflow.com/questions/4004755/why-is-foreach-loop-read-only-in-c-sharp –

+0

你在哪裏找到那個報價? – Thorarins

+0

我發現在一個關於PS中PS的泛型類型的課程(PS是一個衆所周知的在線課程提供者的縮寫) – cnom

回答

8
foreach(var foo in foos) 
{ 
    foo = null; // WRONG, foo is not editable 
    foo.name = "John"; // RIGHT, foo properties are editable 
} 
+0

不是foo.name =「John」修改對象實例? (所以實例是可編輯的) – cnom

+2

@cnom,它看起來像你根本不明白什麼是[實例](http://stackoverflow.com/q/2219566/1997232)。 – Sinatr

+0

「...對象實例不可編輯,但對象屬性可編輯...」=「... foo不可編輯,但foo.name可編輯...」 –

0

Foreach (n in list) if (n.something==true) list.Remove(n);

這將失敗

你不能在列表中刪除的項目,不像說一個for循環

0
foreach var car in cars 
{ 
    //you can edit car.color here 
    //you cannot edit car 
} 
1

什麼手段是,在列表中的項目迭代時不會改變,但是項目的內容可能會變化。

這將改變收集和防止在foreach完成:

foreach(var item in collection) 
{ 
    collection.Remove(item); 
} 

這將在列表中改變一個項目,而不是阻止的foreach完成:

foreach(var item in collection) 
{ 
    item.name = "Neil"; 
} 
+0

這第二個片段指的是列表,而不是迭代對象! – cnom

+0

@cnom第二個片段是指對象,而不是列表! – Neil

+0

對不起,我的意思是相反,第一個片段是指列表... :) – cnom

0

不知道你需要一個例子爲了這。您將跨越集合中的每個對象,並且可以對每個對象執行您喜歡的操作,但不能對集合本身進行更改,例如插入,刪除,清除等。試圖這樣會拋出異常。