2010-04-13 173 views
2

我想了解序列和列表之間的區別。列表和序列之間的區別

在F#中兩者之間有明顯的區別。但是在C#中,我看到程序員將IEnumerable集合稱爲序列。是什麼讓IEnumerable成爲一個序列,它返回一個對象來遍歷集合?

也許真正的區別在函數式語言純粹是發現了什麼?

回答

7

不是真的 - 你往往有一個列表隨機訪問,以及能夠快速獲得其計數等誠然鏈表不具有隨機訪問性質......但當時他們沒有實現IList<T>。由特定平臺提供的設施與一般概念之間存在灰色區域。

序列(如由IEnumerable<T>表示)是隻讀,只進,一次一個項目,並且潛在無限的。當然序列中的任何一個實現也可能是一個列表(例如,List<T>),但是當你把它當作一個序列,你基本上可以遍歷它(重複),就是這樣。

+0

+1好的解釋 - 這是一種模糊的區別,但它是一個重要的理解。 – 2010-04-13 13:41:34

4

我認爲,混亂可能來自一個事實,即像List<T>集合實現接口IEnumerable<T>出現。如果您一般具有子類型關係(例如超類型Shape與兩個子類型RectangleCircle),則可以將關係解釋爲「is-a」等級。

這意味着它是完全正常的說法是「Circle是一個Shape」同樣,人們會說,「List<T>IEnumerable<T>」,也就是「列表序列」。這是有道理的,因爲列表是一種特殊類型的序列。一般來說,序列也可以是延遲生成的,也可以是無限的(這些類型也不能是列表)。不能由名單中產生(非常有效)序列的一個例子是這樣的:

// C# version       // F# version 
IEnumerable<int> Numbers() {   let rec loop n = seq { 
    int i = 0;        yield n 
    while (true) yield return i++;   yield! loop(n + 1) } 
}          let numbers = loop(0) 

這將是F#也是如此,因爲F#list型也實現IEnumerable<T>,但功能編程並不把重點放在面向對象的觀點上(並且在F#中使用頻率較低的隱式轉換可以使得「是」一個解釋)。

2

序列含量的計算需求,因此您可以在不影響你的記憶實現例如無限序列。 所以在C#中,你可以寫一個程序,例如

IEnumerable<int> Null() { 
    yield return 0; 
} 

它將返回零的無限序列。 你可以寫

int[] array = Null().Take(10).ToArray() 

,它會帶10個* 4字節的內存,儘管序列是無限的。 所以,正如你所看到的,C#在序列和集合之間確實存在區別

相關問題