C# 列表、IList和IEnumerable之间的比较

C# 列表、IList和IEnumerable之间的比较,c#,.net,C#,.net,我有一个C#应用程序,在其中我处理一些集合类型。我需要知道这些类型之间的区别: 与其他产品相比,每种产品的区别是什么 IEnumerable是下面扩展或实现的基本接口。它不允许直接访问,并且是只读的。因此,仅当您打算迭代集合时才使用此选项 ICollection扩展了IEnumerable,但还允许添加、删除、测试集合中是否存在元素以及获取元素总数。它不允许通过索引直接访问元素。这将是一个O(n)操作,因为您需要开始对其进行迭代,直到找到相应的元素 IList扩展了ICollection

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

  • 与其他产品相比,每种产品的区别是什么

    • IEnumerable
      是下面扩展或实现的基本接口。它不允许直接访问,并且是只读的。因此,仅当您打算迭代集合时才使用此选项

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

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

    • List
      只是
      IList
      接口的一个具体实现

    在代码中,您应该始终公开对象层次结构中最高的类型,该类型将对应于调用方的需要。因此,例如,如果调用方只在数据集上进行枚举,请使用
    IEnumerable
    。如果他们需要通过索引直接访问元素,则公开一个
    IList

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

    IList

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

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

    与IEnumerable一样,IList也最适合从内存集合(如列表、数组等)中查询数据

    当您要从列表中添加或删除项目时,IList非常有用

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

    IList支持延迟执行

    IList不支持进一步筛选

    IEnumerable

    System.Collections命名空间中存在IEnumerable

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

    IEnumerable最适合从内存集合(如列表、数组等)中查询数据

    IEnumerable不支持从列表中添加或删除项

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

    IEnumerable支持延迟执行


    IEnumerable支持进一步筛选。

    谢谢,很清楚。对于响应时间,当我尝试查找元素或对集合进行排序时,它们中最好的是什么?使用LINQ,您可以通过
    IEnumerable
    实现这一点。这是一个很好的资源,Hashset在哪里合适?@Evonet:
    Hashset
    实现了
    ISet
    ,它实现了
    ICollection
    @DarinDimitrov:ICollection不允许添加或删除。