IEnumerable和Array,IList和List有什么区别?
IEnumerable
和Array
什么区别?
IList
和List
什么区别?
这些似乎有相同的function。
IEnumerable仅提供最小的“可迭代”function。 你可以遍历序列,但是这是关于它的。 这有缺点 – 例如,使用IEnumerable对元素进行计数或获取第n个元素是非常低效的,但也有其优势 – 例如,IEnumerable可能是一个无穷无尽的序列,就像素数序列一样。
数组是一个随机访问的固定大小的集合(即你可以索引到它)。
列表是一个可变大小的集合(即可以添加和删除元素)随机访问。
IList是一个从List,BindingList,ObservableCollection等各种具体类中抽象出列表function(计数,添加,删除,索引器访问)的接口。
IEnumerable是一个接口,允许迭代通过项目集合(例如通过foreach关键字)。
一个数组是.NET的内在。 它拥有相同types的项目,但它是固定的大小。 一旦用x元素创build了一个数组,它就不能增长或缩小。
IList为列表定义了接口,并且还实现了IEnumerable。
List实现IList接口; 这是一个具体的列表types。
.NET列表和数组之间的区别在于列表可以添加元素 – 它们变得足够大以容纳所有必需的项目。 该列表将内部数据存储在一个数组中,当数组不足以容纳所有元素时,会创build一个新数组,并将项目复制到另一个数组中。
IList&数组都实现IEnumerable。 这就是接口的工作原理 – 类实现契约并以类似的方式运行,并可以被视为类似的结果(你知道这个类实现了IEnumerable,你不需要知道是什么意思)。 我build议你阅读接口等等。
IEnumerable和IList是接口 。 数组和列表是类。 数组实现IEnumerable。 List实现了扩展IEnumerable的IList。
编辑:正如itowlson在评论中提到的,Array也实现了IList。
生成一个IEnumerable集合是懒惰的。 例:
public IEnumerable<int> GetTwoInts() { yield return 1; yield return 2; } public void Something() { var twoInts = GetTwoInts(); }
在方法中GetTwoInts()的调用实际上不会导致方法GetTwoInts被执行,因为枚举不会被迭代。
IEnumerable
是一个通用接口,被许多类使用,比如Array
, List
和String
,以便让某人迭代一个集合。 基本上,这是推动foreach
声明的原因。
IList
通常是如何将typesList
variables暴露给最终用户的。 这个接口允许随机访问下面的集合。
这是一个旧post,但还是想到了回复。 IEnumerable是一个行为,而Array是一个数据结构(固定大小的元素的连续集合,便于索引访问元素)。 当一个数组实现IEnumerable时,它应该也描述IEnumerable的固有属性(促进对集合的迭代)。
为了补充其他答案,请注意在执行foreach语句时, IList<T>
和List<T>
之间存在性能差异 。
这是因为List<T>.GetEnumerator
返回的迭代器对象是一个值types,而IList<T>.GetEnumerator
返回的是一个引用types,因此需要一个内存分配(请参阅列表的值types的枚举器c# )。
在我看来, IList<T>
不是一个很好的界面。 例如调用Add
可以抛出(请参阅为什么数组实现IList? )。 如果你需要封装,你最好使用IEnumerable<T>
或IReadOnlyList<T>
。