我想了解序列和列表之間的區別。列表和序列之間的區別
在F#中兩者之間有明顯的區別。但是在C#中,我看到程序員將IEnumerable集合稱爲序列。是什麼讓IEnumerable成爲一個序列,它返回一個對象來遍歷集合?
也許真正的區別在函數式語言純粹是發現了什麼?
我想了解序列和列表之間的區別。列表和序列之間的區別
在F#中兩者之間有明顯的區別。但是在C#中,我看到程序員將IEnumerable集合稱爲序列。是什麼讓IEnumerable成爲一個序列,它返回一個對象來遍歷集合?
也許真正的區別在函數式語言純粹是發現了什麼?
不是真的 - 你往往有一個列表隨機訪問,以及能夠快速獲得其計數等誠然鏈表不具有隨機訪問性質......但當時他們沒有實現IList<T>
。由特定平臺提供的設施與一般概念之間存在灰色區域。
序列(如由IEnumerable<T>
表示)是隻讀,只進,一次一個項目,並且潛在無限的。當然序列中的任何一個實現也可能是一個列表(例如,List<T>
),但是當你把它當作一個序列,你基本上可以遍歷它(重複),就是這樣。
我認爲,混亂可能來自一個事實,即像List<T>
集合實現接口IEnumerable<T>
出現。如果您一般具有子類型關係(例如超類型Shape
與兩個子類型Rectangle
和Circle
),則可以將關係解釋爲「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#中使用頻率較低的隱式轉換可以使得「是」一個解釋)。
序列含量的計算需求,因此您可以在不影響你的記憶實現例如無限序列。 所以在C#中,你可以寫一個程序,例如
IEnumerable<int> Null() {
yield return 0;
}
它將返回零的無限序列。 你可以寫
int[] array = Null().Take(10).ToArray()
,它會帶10個* 4字節的內存,儘管序列是無限的。 所以,正如你所看到的,C#在序列和集合之間確實存在區別
+1好的解釋 - 這是一種模糊的區別,但它是一個重要的理解。 – 2010-04-13 13:41:34