我想了解序列和列表之间的区别。列表和序列之间的区别
在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