List、IList和IEnumerable的比较

56

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

  1. List:可变大小的列表。
  2. IList:定义操作元素的方法,如添加、删除、索引和枚举。实现此接口的类可以使用与数组相似的语法访问元素。
  3. IEnumerable:支持简单迭代。不支持在集合中插入、删除或修改元素。

每个类型与其他类型相比有什么不同?

2个回答

128
  • IEnumerable<T>是以下接口的基础接口。它不允许直接访问,且只读。因此,仅在您打算迭代集合时使用它。

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

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

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

在代码中,您应始终公开对象层次结构中最高的类型,以满足调用方的需求。例如,如果调用者只会枚举数据集,请使用IEnumerable<T>。如果他们需要直接访问元素,则公开IList<T>

List<T>应仅在您的代码内部使用,但通常不会出现在您公开的方法签名中。这使您更加灵活,因为您可以轻松地交换具体实现而不破坏协议。


谢谢,很清楚。关于响应时间,当我尝试查找元素或对集合进行排序时,哪个是最好的? - Lamloumi Afif
5
使用 LINQ,您可以使用IEnumerable<T>来实现这一点。 - Darin Dimitrov
这是一个很棒的资源,HashSet在哪里适用? - Evonet
1
@Evonet:HashSet<T> 实现了 ISet<T>,而 ISet<T> 又实现了 ICollection<T> - Erti-Chris Eelmaa
@DarinDimitrov:Icollection 不允许添加或删除。 - nimish jain

1

IList

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

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

与IEnumerable一样,IList也是查询内存中集合(如List、Array等)中数据的最佳选择。

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

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

IList支持延迟执行。

IList不支持进一步过滤。

IEnumerable

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

IEnumerable是一个单向集合,不能在项之间向后移动。

与IEnumerable一样,IList也是查询内存中集合(如List、Array等)中数据的最佳选择。

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

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

IEnumerable支持延迟执行。

IEnumerable支持进一步过滤。


IEnumerable不支持向列表添加或删除项。这是公共接口中非常重要的最佳实践,调用者提供的集合不应被执行代码修改。通过不提供Add/Remove功能,IEnumerable有助于防止集合在调用者不知情的情况下被修改。 - simo.3792

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接