2014-03-01 25 views

回答

7

是:foreach

foreach(SerializationEntry entry in info) {...} 

你會原諒沒有注意到這一點,因爲它沒有實現和IEnumerable API,但是:foreach不要求它:)

請參閱MSDN爲什麼這提供每個項目:http://msdn.microsoft.com/en-us/library/system.runtime.serialization.serializationentry(v=vs.110).aspx

+0

有趣!你有什麼想法,爲什麼它不實施'IEnumerable'雖然?爲什麼它會返回一個具體的'SerializationInfoEnumerator'而不是'IEnumerator'?這似乎是一個奇怪的選擇.. – dcastro

+0

@dcastro如果我不得不猜測,IEnumerable的缺乏是一種無法糾正的過失,因爲它不是必需的。自定義迭代器的選擇並不罕見,特別是在代碼早於泛型的情況下,意圖通過使用結構來表示狀態來避免裝箱和分配。即使在泛型代碼中,它也並不少見:List-of-T有一個自定義迭代器,例如。 –

+0

是的,'List '也返回自己的自定義迭代器,實現「拋出異常如果列表已經改變」機制。但它仍然返回僞裝成接口的迭代器。但我同意這可能是爲了避免拳擊 - 我只注意到['SerializationInfoEnumerator'](http://msdn.microsoft.com/zh-cn/library/system.runtime.serialization.serializationinfoenumerator(v = vs.110)。 aspx)有兩個'Current'屬性,一個顯式實現返回一個'object',另一個返回'SerializationEntry'。 – dcastro

2

有沒有出現to be a "contains"方法。有一個GetEnumerator方法可以用來循環。但馬克的foreach建議是更好的:) :)

+0

對於最有用的定義,'GetEnumerator()'*是*'foreach' - 它們本質上是同義詞 –

+0

不知道。謝謝 – RossG

+0

對於完整的上下文,'foreach(obj中的var項){/ *您的代碼* /}'基本上*:'使用(var iter = obj.GetEnumerator()){while(iter.MoveNext()){ var item = iter.Current;/*你的代碼* /}}' –