List,IList和IEnumerable之间的比较

时间:2013-11-23 09:59:29

标签: c# .net

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

  1. List
  2. IList
  3. IEnumerable
  4. 与其他人相比,每个人有什么不同?

2 个答案:

答案 0 :(得分:80)

  • IEnumerable<T>是以下扩展或实现的基本接口。它不允许直接访问,只读。因此,只有在您打算迭代集合时才使用它。

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

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

  • List<T>只是IList<T>界面的具体实现。

在代码中,您应始终公开对象层次结构中最高的类型,该类型将与调用者的需求相对应。因此,例如,如果调用者仅枚举数据集,请使用IEnumerable<T>。如果他们需要通过索引直接访问元素,则公开IList<T>

List<T>只能由您的代码在内部使用,但通常不会出现在您公开的方法的签名中。这为您提供了更大的灵活性,因为您可以在不违反合同的情况下轻松交换具体实施。

答案 1 :(得分:-1)

IList

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

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

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

当您要在列表中添加或删除项目时,IList很有用。

IList无需迭代集合即可发现集合中的元素数量。

IList支持推迟执行。

IList不支持进一步的过滤。

IEnumerable

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

IEnumerable是仅向前的集合,它不能在项目之间向后移动。

IEnumerable最好从列表,数组等内存集合中查询数据。

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

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

IEnumerable支持延迟执行。

IEnumerable支持进一步的过滤。