是否有人會描述IEnumerable和IEnumerable和數組 之間的區別以及在哪裏使用它..關於它的所有信息以及如何使用它。IEnumerable和數組有什麼區別?
回答
數組是指具有設置大小的對象的集合。
int[] array = [0, 1, 2];
這使得在情況下,您可能要訪問某個項目在特定的點的集合中,因爲工作地點中的每個元素的內存已經知道
array[1];
而且,非常有用陣列的大小可以快速計算。
IEnumerable,另一方面,基本上說,給定一個開始位置可以得到下一個值。這樣的一個例子可以是一個無窮級數的數字:
public IEnumerable<int> Infinite()
{
int i = 0;
while(true)
yield return i++;
}
不同於陣列的枚舉集合可以是任何尺寸,並且可以創建的元素,因爲它們是必需的,而不是前期,這允許有力結構,並被LINQ廣泛使用,以促進複雜的查詢。
//This line won't do anything until you actually enumerate the created variable
IEnumerable<int> firstTenOddNumbers = Infinite().Where(x => x % 2 == 1).Take(10);
但是獲得特定元素的唯一方法是從頭開始並枚舉到所需的元素。這將比從預先生成的陣列獲取元素要昂貴得多。
當然你可以枚舉一個數組,所以一個數組實現了IEnumerable接口。
+1徹底的答案......儘管2147483647幾乎是無限的。 ;) – 2010-08-26 17:05:15
@djacobson它*是*無限,它只是不連續。下一個值是-2147483648 ... :) – 2010-08-26 17:11:23
無限性取決於編譯器設置。 – nawfal 2014-01-27 20:48:29
數組是數據的集合。這意味着這些物品是連續存儲的,並且可以直接使用。
IEnumerable是一個描述的數據集合。它們本身不是集合。具體而言,這意味着收集可以逐步完成,每次一個項目。
如果將變量定義爲IEnumerable類型,那麼它可以引用適合該描述的任何類型的集合。
數組是可枚舉的。列表,詞典,集合和其他集合類型也是如此。此外,看起來並不收集的東西可以是Enumerable,例如字符串(即IEnumerable<char>
),或者是由Enumerable.Range()
返回的對象,它爲每個步驟生成一個新項目,而實際上並沒有將它保存在任何地方。
有一件事是,數組允許隨機訪問一些固定大小的內容。 IEnumerable接口順序提供數據的位置,您可以一次從IEnumerable接口提取數據,直到數據源耗盡。
.NET的IEnumerable接口名稱錯誤 - 它應該是IIterable。基本上是一個System.Collection.IEnumerable或(因爲泛型)System.Collection.Generic.IEnumerable允許您使用foreach實現這些接口的對象。
(旁註:其實.NET使用鴨子類型爲的foreach,所以你不需要實現這些接口 - 這是不夠的,如果你提供合適的方法實現。)
數組(系統。數組)是一種序列類型(其中序列的意思是一個可迭代的數據結構,即實現IEnumerable的任何東西),但有一些重要的區別。
例如,IEnumerable可以 - 並且通常 - 延遲加載。這意味着,除非明確地遍歷它,否則不會創建項目。如果你不知道這會導致奇怪的行爲。 因此,IEnumerable無法告訴你它包含多少項,除非實際迭代它(System.Linq.Enumerable類中的Count擴展方法)。
一個數組有一個Length屬性,並且由此我們得出了最重要的區別:一個數組,如果一個固定的(和已知的)項目序列。它還提供了一個索引器,因此您可以方便地訪問它的項目,而無需實際迭代它。
爲了記錄,.NET中的「真實」枚舉是使用enum關鍵字定義的類型。它們允許您在不使用幻數或字符串的情況下表達選擇。當用FlagsAttribute標記時,它們也可以用作標誌。
我建議你使用你的favioure搜索引擎來獲得關於這些概念的更多細節 - 我的簡要總結顯然不是爲了深入洞察這些特性。
.Net中使用的術語非常好。來自http://en.wikipedia.org/wiki/Enumeration:「在數學和理論計算機科學中,一組枚舉的最廣泛和最抽象的定義是其所有元素的精確列表。」你所說的「真正的」枚舉更適合稱爲「枚舉類型」:http://en.wikipedia.org/wiki/Enumerated_type – Gabe 2010-09-08 07:04:09
陣列
一個.NET陣列是連續地存儲在存儲器中的多個值的集合。數組中的單個元素可以通過索引隨機訪問(並且這樣做效率很高)。陣列的重要的成員是:
this[Int32 index]
(索引操作符)Length
C#具有內置的用於陣列的支持,他們可以直接從碼被初始化:
var array = new[] { 1, 2, 3, 4 };
數組也可以是多維的並且實現多個接口,包括IEnumerable<T>
(其中T
是數組的元素類型)。
的IEnumerable <Ť>
的IEnumerable<T>
接口定義了方法GetEnumerator()
但是該方法很少直接使用。相反,foreach
循環用於枚舉迭代:
IEnumerable<T> enumerable = ...;
foreach (T element in enumerable)
...
如果枚舉一個數組或列表所做的所有元素的枚舉過程中存在的枚舉,但它也可以枚舉元素在飛行中創建。 yield return
構造對此非常有用。
它可以創建一個枚舉的數組:
var array = enumerable.ToArray();
這將讓來自枚舉所有元素和它們在單個陣列中存儲連續。
概括起來:
- 陣列是元件的集合,該集合可以通過索引隨機訪問
- 枚舉是抽象以上元素的集合,可以在另一個之後向前移動訪問的一個方式
- 1. 非泛型IEnumerable和泛型IEnumerable <T>有什麼區別?
- 2. int和char數組有什麼區別?
- 3. malloc和數組有什麼區別
- 4. 數組和ArrayList有什麼區別?
- 5. 字典和數組有什麼區別?
- 6. 數組和散列有什麼區別?
- 7. IEnumerable和Array,IList和List之間有什麼區別?
- 8. CPU和芯片組有什麼區別?
- 9. 元組和compress_pair有什麼區別?
- 10. 組件和指令有什麼區別?
- 11. 組件和涼亭有什麼區別?
- 12. IQueryable的Contains()和IEnumerable的Contains()之間有什麼區別?
- 13. 列表<string>和IEnumerable <String>有什麼區別?
- 14. NumPy數組和簡單Python數組有什麼區別?
- 15. Smalltalk中的數組和字面數組有什麼區別?
- 16. 數組地址和數組本身有什麼區別嗎?
- 17. 原始數組和引用數組之間有什麼區別?
- 18. 嵌套數組和關聯數組有什麼區別?
- 19. 這兩個數組有什麼區別?
- 20. 數組與對象有什麼區別?
- 21. 有什麼區別`和$(Bash中有什麼區別?
- 22. 有什麼區別? :和||
- 23. &&和||有什麼區別?
- 24. 「/」和「/ *」有什麼區別?
- 25. 有什麼區別:。!和:r!?
- 26. ==和===有什麼區別?
- 27. Appender和〜有什麼區別?
- 28. $ @和$ *有什麼區別?
- 29. is和=有什麼區別?
- 30. #.00和#。##有什麼區別?
枚舉= http://msdn.microsoft.com/en-us/library/9b9dty7d%28VS.80%29.aspx 數組= http://msdn.microsoft.com/en-us/圖書館/ 9b9dty7d%28VS.80%29.aspx – w69rdy 2010-08-26 16:39:51
@ w69rdy - 我認爲他的意思是差異IEnumerable和數組之間。 – 2010-08-26 16:48:23