2011-04-03 163 views
7

對不起,這個模糊的問題,但我一直在尋找一天的最好的一部分,我已經閱讀文章後文章(和許多問題在這裏),但找不到一個容易理解的答案。非泛型IEnumerable和泛型IEnumerable <T>有什麼區別?

我(我想)知道什麼IEnumerable的是對的,但我只是不明白,當它與泛型類型參數定義是什麼意思,例如:

IEnumerable<int> test = method(); 

這只是讓我狂!請讓我擺脫苦難並解釋它意味着什麼?

回答

13

一種IEnumerable形式使用基本上是對象的集合。它具有方法GetEnumerator(),它允許您遍歷枚舉中的所有對象。

IEnumerable<int>基本上是一個整數的集合。它具有方法GetEnumerator(),它允許您遍歷枚舉中的所有整數。

IEnumerable<int> test = method();表示method()從某處獲得整數。它可能是一個List,一個數組或其他數據類型,但它絕對是它們的一組,並且它們都是整數,並且您可以遍歷它們。

這篇文章可能會有所幫助,以及:What's the difference between IEnumerable and Array, IList and List?

+0

之間的微妙差別,我想我現在明白了,我沒有意識到它可能是一個集合我只是不明白它是如何工作的。是否有一個很好的資源可以顯示,比較IEnumerable/list/arrays的好處/缺陷,因爲我真的想了解更多信息。 +1(當我可以!) – idiot 2011-04-03 10:53:28

+0

列表和數組都實現'IEnumerable'。 'System.Collections.Generic'中的所有通用集合實現'IEnumerable '。您可能有興趣在這篇文章:http://stackoverflow.com/questions/764748/whats-the-difference-between-ienumerable-and-array-ilist-and-list – smartcaveman 2011-04-03 11:00:27

+0

謝謝...並標記爲答案.. 。您可能想要在主要答案中編輯/放置該鏈接,因爲這實際上使我現在完全理解了。 – idiot 2011-04-03 11:11:23

2

我只是想到IEnumerable<int>就像我想到的List<int>一樣,我認爲這會更自然一點。需要提醒的是一個IEnumerable<int>沒有做相當多的List<int>,並基本上它只是INTS的事情可以列舉

+2

我不太喜歡這個比喻。一個列表假定所有的項目都在一個地方。 「IEnumerable」只是說你可以按順序獲得所有的項目。這就像電話簿和互聯網的區別。我可以從任何地方獲得芝加哥管道工的所有數字,但在電話簿中,他們已經在列表中,而在IEnumerable或互聯網上,他們可以是任何東西,我只需要知道如何找到他們 - 雖然我沒有讓你失望,但我認爲你的答案可以使用更多的清晰度。 – smartcaveman 2011-04-03 03:28:01

+0

user689466正在尋找理解IEnumerable的方法。顯然有不同 - 這只是一個容易理解的概念的起點,一旦他嘮叨,他可以繼續理解兩個 – kenwarner 2011-04-05 23:17:05

0

你要找的是「仿製藥」這個詞,和您給出的示例是將IEnumerable用作int類型項的通用屬性。這意味着您正在使用的IEnumerable集合是強類型的,只能保存int對象而不是任何其他類型。

谷歌「C#泛型IEnumerable」,你會發現你想要的所有信息。

0

IEnumerable表示它可以在foreach循環中使用。

test可以在

foreach(int item : test) 
{ 
    console.writeline(item); 
} 
2

IEnumerableGetEnumerator方法,它會返回一個IEnumerator,其Current方法會返回一個ObjectIEnumerable<T>有一個GetEnumerator方法,該方法將返回一個IEnumerator<T>,其Current方法將返回T。如果事先知道枚舉數要返回的對象的預期類型,通常最好使用通用表單。

另一個區別是,IEnumerator<T>繼承IDisposable,它允許使用枚舉器完成的代碼在其上調用Dispose而不必擔心它是否受支持。相比之下,如果使用非通用的IEnumerator,則需要測試其是否爲IDisposable,並且如果是,則調用Dispose。請注意,使用IEnumerable/IEnumerator的非通用形式並不能解除調用Dispose的要求之一。舉例來說,除非發生垃圾收集,否則將vb樣式集合轉換爲IEnumerable,然後在不致電Dispose的情況下調用100,000次將會非常緩慢(甚至在i7上會持續很多秒)。在每次電話會議後處理IEnumerator將會加速超過百倍。

相關問題