【问题标题】:Comparison between List, IList, and IEnumerableList、IList 和 IEnumerable 之间的比较
【发布时间】:2013-11-23 09:59:28
【问题描述】:

我有一个 C# 应用程序,我在其中处理一些集合类型。我需要知道这些类型之间的区别是什么:

  1. List
  2. IList
  3. IEnumerable

与其他人相比,每个人有什么不同?

【问题讨论】:

    标签: c# .net


    【解决方案1】:
    • IEnumerable<T> 是以下扩展或实现的基本接口。它不允许直接访问并且是只读的。因此,仅当您打算迭代集合时才使用它。

    • ICollection<T> extendsIEnumerable<T> 但还允许添加、删除、测试元素是否存在于集合中并获取元素总数。它不允许通过索引直接访问元素。这将是一个 O(n) 操作,因为您需要开始对其进行迭代,直到找到相应的元素。

    • IList<T> 扩展了ICollection<T>(因此它继承了它的所有属性),但还允许通过索引直接访问元素。这是一个 O(1) 操作。

    • List<T> 只是IList<T> 接口的具体实现。

    在您的代码中,您应该始终公开对象层次结构中与调用者的需求相对应的最高类型。因此,例如,如果调用者只想枚举数据集,请使用IEnumerable<T>。如果他们需要通过索引直接访问元素,请公开IList<T>

    List<T> 只能在您的代码内部使用,但通常不会出现在您要公开的方法的签名中。这为您提供了更大的灵活性,因为您可以在不违反合同的情况下轻松交换具体实现。

    【讨论】:

    • 谢谢,很清楚。对于响应时间,当我尝试查找元素或对集合进行排序时,它们中最好的是什么?
    • 使用 LINQ,您可以通过 IEnumerable<T> 实现这一目标。
    • 这是一个很棒的资源,Hashset在哪里适合它?
    • @Evonet: HashSet<T> 实现 ISet<T> 实现 ICollection<T>
    • @DarinDimitrov : Icollection 不允许添加或删除。
    【解决方案2】:

    IList

    IList 存在于 System.Collections 命名空间中。

    IList 用于访问列表中特定位置/索引的元素。

    与 IEnumerable 一样,IList 也最适合从 List、Array 等内存集合中查询数据。

    当您想从列表中添加或删除项目时,IList 很有用。

    IList 可以在不迭代集合的情况下找出集合中的元素个数。

    IList 支持延迟执行。

    IList 不支持进一步过滤。

    IEnumerable

    IEnumerable 存在于 System.Collections 命名空间中。

    IEnumerable 是一个只向前的集合,它不能向后和在项目之间移动。

    IEnumerable 最好从内存中的集合(如 List、Array 等)中查询数据。

    IEnumerable 不支持在列表中添加或删除项目。

    使用 Ienumerable 我们可以在迭代集合后找出集合中的元素个数。

    IEnumerable 支持延迟执行。

    IEnumerable 支持进一步过滤。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-07
      • 2019-02-01
      • 1970-01-01
      • 2018-01-05
      • 1970-01-01
      • 1970-01-01
      • 2014-06-19
      相关资源
      最近更新 更多