代码之家  ›  专栏  ›  技术社区  ›  Peanut

列表和序列之间的区别

  •  2
  • Peanut  · 技术社区  · 15 年前

    我在试着理解序列和列表之间的区别。

    在F#中,两者之间有着明显的区别。但是在C语言中,我看到程序员将IEnumerable集合称为序列。是什么使IEnumerable成为一个序列的事实是它返回一个对象来遍历集合?

    也许真正的区别仅仅存在于函数式语言中?

    3 回复  |  直到 15 年前
        1
  •  7
  •   Jon Skeet    15 年前

    不是真的-你倾向于随机访问一个列表,以及能够快速得到它的计数等。无可否认,链表没有随机访问的性质。。。但是他们没有实现 IList<T>

    序列(由 IEnumerable<T> )是只读的,只向前,一次一个项目,并且可能是无限的。当然,任何人 实施 List<T>

        2
  •  4
  •   Tomas Petricek    15 年前

    我认为这种混乱可能是因为 List<T> 实现接口 IEnumerable<T> . 如果您通常有子类型关系(例如超类型 Shape Rectangle Circle ),可以将关系解释为“is-a”层次结构。

    这意味着说“这是完全正确的” 是一个 形状 同样,人们也会这么说 列表<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> 但是函数式编程并没有把重点放在面向对象的观点上(而支持“is a”解释的隐式转换在F#中使用的频率较低)。

        3
  •  2
  •   Vadym Chekan    15 年前

    序列内容是按需计算的,因此您可以实现例如无限序列而不影响内存。 例如,在C语言中,你可以写一个序列

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

    它将返回无穷的零序列。 你可以写

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

    它需要10*4字节的内存,尽管序列是无限的。 如你所见,C#在序列和集合之间有区别