【发布时间】:2013-11-23 09:59:28
【问题描述】:
【问题讨论】:
【问题讨论】:
IEnumerable<T> 是以下扩展或实现的基本接口。它不允许直接访问并且是只读的。因此,仅当您打算迭代集合时才使用它。
ICollection<T> extendsIEnumerable<T> 但还允许添加、删除、测试元素是否存在于集合中并获取元素总数。它不允许通过索引直接访问元素。这将是一个 O(n) 操作,因为您需要开始对其进行迭代,直到找到相应的元素。
IList<T> 扩展了ICollection<T>(因此它继承了它的所有属性),但还允许通过索引直接访问元素。这是一个 O(1) 操作。
List<T> 只是IList<T> 接口的具体实现。
在您的代码中,您应该始终公开对象层次结构中与调用者的需求相对应的最高类型。因此,例如,如果调用者只想枚举数据集,请使用IEnumerable<T>。如果他们需要通过索引直接访问元素,请公开IList<T>。
List<T> 只能在您的代码内部使用,但通常不会出现在您要公开的方法的签名中。这为您提供了更大的灵活性,因为您可以在不违反合同的情况下轻松交换具体实现。
【讨论】:
IEnumerable<T> 实现这一目标。
HashSet<T> 实现 ISet<T> 实现 ICollection<T>。
IList
IList 存在于 System.Collections 命名空间中。
IList 用于访问列表中特定位置/索引的元素。
与 IEnumerable 一样,IList 也最适合从 List、Array 等内存集合中查询数据。
当您想从列表中添加或删除项目时,IList 很有用。
IList 可以在不迭代集合的情况下找出集合中的元素个数。
IList 支持延迟执行。
IList 不支持进一步过滤。
IEnumerable
IEnumerable 存在于 System.Collections 命名空间中。
IEnumerable 是一个只向前的集合,它不能向后和在项目之间移动。
IEnumerable 最好从内存中的集合(如 List、Array 等)中查询数据。
IEnumerable 不支持在列表中添加或删除项目。
使用 Ienumerable 我们可以在迭代集合后找出集合中的元素个数。
IEnumerable 支持延迟执行。
IEnumerable 支持进一步过滤。
【讨论】: