我有一个 C# 应用程序,其中我处理一些集合类型。我需要知道这些类型之间的区别:
List
:可变大小的列表。IList
:定义操作元素的方法,如添加、删除、索引和枚举。实现此接口的类可以使用与数组相似的语法访问元素。IEnumerable
:支持简单迭代。不支持在集合中插入、删除或修改元素。
每个类型与其他类型相比有什么不同?
我有一个 C# 应用程序,其中我处理一些集合类型。我需要知道这些类型之间的区别:
List
:可变大小的列表。IList
:定义操作元素的方法,如添加、删除、索引和枚举。实现此接口的类可以使用与数组相似的语法访问元素。IEnumerable
:支持简单迭代。不支持在集合中插入、删除或修改元素。 每个类型与其他类型相比有什么不同?
IEnumerable<T>
是以下接口的基础接口。它不允许直接访问,且只读。因此,仅在您打算迭代集合时使用它。
ICollection<T>
扩展了IEnumerable<T>
,但除此之外还允许添加、删除、测试集合中是否存在元素,并获取元素总数。它不允许通过索引直接访问元素。这将是一个O(n)操作,因为您需要开始迭代,直到找到相应的元素。
IList<T>
扩展了ICollection<T>
(因此继承了所有其属性),但除此之外还允许通过索引直接访问元素。这是一个O(1)操作。
List<T>
只是IList<T>
接口的具体实现。
在代码中,您应始终公开对象层次结构中最高的类型,以满足调用方的需求。例如,如果调用者只会枚举数据集,请使用IEnumerable<T>
。如果他们需要直接访问元素,则公开IList<T>
。
List<T>
应仅在您的代码内部使用,但通常不会出现在您公开的方法签名中。这使您更加灵活,因为您可以轻松地交换具体实现而不破坏协议。
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<T>
来实现这一点。 - Darin DimitrovHashSet<T>
实现了ISet<T>
,而ISet<T>
又实现了ICollection<T>
。 - Erti-Chris Eelmaa