2010-04-13 348 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#在序列和集合之间确实存在区别

相关问题