我有一个C#应用程序,我在其中处理一些集合类型。我需要知道这些类型之间的区别是什么:
List
IList
IEnumerable
与其他人相比,每个人有什么不同?
答案 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支持进一步的过滤。