Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有人能告诉我什么';列表、集合和可枚举之间的区别是什么?_C#_List_Collections_Ienumerable_Enumerable - Fatal编程技术网

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++风格迭代器,但是前缀循环不易出错。p> 我相信您可以自己阅读文档。我将在这里做一个简短的总结:

  • 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。我发布的答案有点太快了,结果不够具体。我道歉