2010-08-26 135 views
8

是否有人會描述IEnumerable和IEnumerable和數組 之間的區別以及在哪裏使用它..關於它的所有信息以及如何使用它。IEnumerable和數組有什麼區別?

+1

枚舉= 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

+1

@ w69rdy - 我認爲他的意思是差異IEnumerable和數組之間。 – 2010-08-26 16:48:23

回答

11

數組是指具有設置大小的對象的集合。

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接口。

+2

+1徹底的答案......儘管2147483647幾乎是無限的。 ;) – 2010-08-26 17:05:15

+7

@djacobson它*是*無限,它只是不連續。下一個值是-2147483648 ... :) – 2010-08-26 17:11:23

+0

無限性取決於編譯器設置。 – nawfal 2014-01-27 20:48:29

2

數組是數據的集合。這意味着這些物品是連續存儲的,並且可以直接使用。

IEnumerable是一個描述的數據集合。它們本身不是集合​​。具體而言,這意味着收集可以逐步完成,每次一個項目。

如果將變量定義爲IEnumerable類型,那麼它可以引用適合該描述的任何類型的集合。

數組是可枚舉的。列表,詞典,集合和其他集合類型也是如此。此外,看起來並不收集的東西可以是Enumerable,例如字符串(即IEnumerable<char>),或者是由Enumerable.Range()返回的對象,它爲每個步驟生成一個新項目,而實際上並沒有將它保存在任何地方。

1

有一件事是,數組允許隨機訪問一些固定大小的內容。 IEnumerable接口順序提供數據的位置,您可以一次從IEnumerable接口提取數據,直到數據源耗盡。

3

.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搜索引擎來獲得關於這些概念的更多細節 - 我的簡要總結顯然不是爲了深入洞察這些特性。

+1

.Net中使用的術語非常好。來自http://en.wikipedia.org/wiki/Enumeration:「在數學和理論計算機科學中,一組枚舉的最廣泛和最抽象的定義是其所有元素的精確列表。」你所說的「真正的」枚舉更適合稱爲「枚舉類型」:http://en.wikipedia.org/wiki/Enumerated_type – Gabe 2010-09-08 07:04:09

2

陣列

一個.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(); 

這將讓來自枚舉所有元素和它們在單個陣列中存儲連續。

概括起來:

  • 陣列是元件的集合,該集合可以通過索引隨機訪問
  • 枚舉是抽象以上元素的集合,可以在另一個之後向前移動訪問的一個方式