2011-12-21 141 views
2

虽然我做了一个程序,但有时候我有这个疑问。我一直在使用List<T>,但我没有使用其他的。有人可以告诉我List,Collection和Enumerable有什么区别?

我想知道什么时候每一个更好使用,以及在什么情况下。

+6

查看文档。 – SLaks 2011-12-21 19:21:41

+0

取决于你想要什么也做列表泛型是创建或确保东西类型的具体名单真棒方式也是一个集合,但如果你想枚举通的东西,你必须非常设计自己枚举(计数器)的IEnumerable 将是一件好事..但随后有还的foreach和for循环,它只是取决于你想要做什么和如何快速您想要它做尼古拉斯发布了一些伟大的链接来解释它最好的.. – MethodMan 2011-12-21 19:31:20

回答

6

我确定你可以自己阅读文档。我在这里给一个简短的总结:

  1. IEnumerable是暴露在集合的枚举的接口。如果希望能够支持迭代,例如在foreach循环内实现此接口。
  2. CollectionIEnumerable实现(因此可以在其上进行迭代),其通常进一步由希望有收集样行为(即使用AddRemoveContains等)用户定义的类延长。它也可以“按原样”使用。
  3. List也是IEnumerable的一个实现(因此你可以遍历它),它通常被用来作为某种类型对象的容器。在后台使用动态调整阵列,并且是ArrayList的通用等效项。

请注意,虽然IEnumerable既可以是通用和非通用,CollectionList只能使用泛型类。

1

列表是保持以线性方式项实例化的类型。 (编辑:我被告知它使用动态数组实现,而不是使用链接列表,这只是我的猜测)。

ICollection/CollectionBaseIEnumerable不是直接实例化类型。

CollectionBase/ICollection是继承/由认为自己是收集和保持多个项目的任何类实现的基类/接口。 CollectionBase/ICollection也允许你传递集合而不知道它们的实现。

IEnumerable也是一个接口,提供迭代集合的方法。 IEnumerable基本上可让您在集合上使用foreach循环。您可以直接使用接口方法来获取一些C++样式迭代器,但是foreach循环不太容易出错。

+2

名单使用动态数组,而不是链接列表。 – Tudor 2011-12-21 19:25:59

+1

@Digitlworld:在微软CLR团队的奇异世界,列表实际上没有列出了CS的感觉:后备存储两个'SCG.List '和'SC.List'是,通过分配动态增长的数组和复制。 ICollection和IEnumerable完全不是类型:它们是接口。 – 2011-12-21 19:30:09

+0

在C#领域,我的理解是接口,抽象类和普通类都是'Type'类型。它们定义的基于反射的实例都是'Type'的可接受值。 – digitlworld 2011-12-21 19:32:44

0

如果你看三国的定义(见下文),你会发现List实现EnumerableICollectionICollection工具IEnumerable。更清楚的是:

ListCLASS它可以存储可变数量的相同类型的项目加上其他两个接口指定的功能。

ICollection是指定一个通用的方法来操纵集合的接口。注意:这是一个接口,因此不能被实例化。

IEnumerable是指定遍历集合的装置的接口。注意:这是一个接口,因此不能被实例化。

List

表示可通过索引访问的对象的强类型列表。提供搜索,排序和操作列表的方法。

public class List<T> : IList<T>, ICollection<T>, 
IEnumerable<T>, IList, ICollection, IEnumerable 

ICollection

定义的方法来操作泛型集合。

public interface ICollection<T> : IEnumerable<T>, 
IEnumerable 

IEnumerable

暴露枚举,它支持在一个指定类型的集合的简单迭代。

public interface IEnumerable<out T> : IEnumerable 
相关问题