C# 有人能告诉我什么';列表、集合和可枚举之间的区别是什么?
当我做一个程序时,有时我会有这种怀疑。我一直在使用C# 有人能告诉我什么';列表、集合和可枚举之间的区别是什么?,c#,list,collections,ienumerable,enumerable,C#,List,Collections,Ienumerable,Enumerable,当我做一个程序时,有时我会有这种怀疑。我一直在使用列表,但我没有使用其他列表 我想知道在什么情况下每一个都更适合使用。MSDN可以: 列表是可实例化类型,以线性方式保存项目。(编辑:我听说它是用动态数组实现的,而不是我猜测的链表) ICollection/CollectionBase和IEnumerable不是可直接实例化的类型 CollectionBase/ICollection是一个基类/接口,由任何认为自己是集合并包含多个项的类继承/实现CollectionBase/IColle
列表
,但我没有使用其他列表
我想知道在什么情况下每一个都更适合使用。MSDN可以:
ICollection
/CollectionBase
和IEnumerable
不是可直接实例化的类型
CollectionBase
/ICollection
是一个基类/接口,由任何认为自己是集合并包含多个项的类继承/实现CollectionBase
/ICollection
还允许您在不知道其实现的情况下传递集合
IEnumerable
也是一个接口,它提供了迭代集合的方法IEnumerable
基本上允许您在集合上使用foreach
循环。你可以直接使用接口方法来获取一些C++风格迭代器,但是IEnumerable
是一个在集合上公开枚举数的接口。如果希望能够支持迭代,例如在foreach
循环中,则实现此接口Collection
是IEnumerable
的一个实现(因此您可以对其进行迭代),它通常由希望具有类似于集合的行为的用户定义类进一步扩展(即使用Add
,Remove
,Contains
等)。它也可以“按原样”使用List
也是IEnumerable
的一个实现(因此您可以对其进行迭代),它通常“按原样”用作特定类型对象的容器。在后台使用动态调整数组,它是ArrayList
的通用等价物请注意,
IEnumerable
既可以是泛型也可以是非泛型,Collection
和List
只能用作泛型类。如果您查看这三个类的定义(见下文)您会注意到,List
实现了Enumerable
和ICollection
和ICollection
实现了IEnumerable
。更清楚地说:
List
是一个类,它可以存储不同数量的相同类型的项以及其他两个接口指定的功能
ICollection
是一个指定操作集合的通用方法的接口。注意:这是一个接口,因此无法实例化
IEnumerable
是一个接口,用于指定对集合进行迭代的方法。注意:这是一个接口,因此无法实例化
表示可由索引访问的对象的强类型列表。提供搜索、排序和操作列表的方法
public class List<T> : IList<T>, ICollection<T>,
IEnumerable<T>, IList, ICollection, IEnumerable
公共类列表:IList、ICollection、,
IEnumerable,IList,ICollection,IEnumerable
定义操作泛型集合的方法
public interface ICollection<T> : IEnumerable<T>,
IEnumerable
公共接口ICollection:IEnumerable,
数不清
公开枚举数,该枚举数支持对指定类型的集合进行简单迭代
public interface IEnumerable<out T> : IEnumerable
公共接口IEnumerable:IEnumerable
请参阅文档。根据您想对列表做什么,泛型是创建或确保特定类型列表也是一个集合的好方法,但如果您想通过某种方法进行枚举,则必须设计自己的枚举器(计数器)IEnumerable。。但是还有foreach和for循环,这取决于你想做什么以及你想做得多快Nicholas发布了一些很好的链接来解释它。列表使用动态数组,而不是链表。@DigitWorld:在微软CLR团队的奇怪世界里,列表实际上不是CS意义上的列表:SCG.List
和SC.List
的备份存储都是一个通过分配和复制动态增长的数组。ICollection和IEnumerable根本不是类型:它们是接口。在C#land中,我的理解是接口、抽象类和普通类都是Type
s。它们定义的基于反射的实例都是Type
@Digitlworld接口的可接受值,而不是基类。ICollection只是一个接口,同样是IEnumerable。我发布的答案有点太快了,结果不够具体。我道歉