IEnumerable和Array之间有什么区别?IList和List之间又有什么区别?
IEnumerable和Array的区别在于,IEnumerable是一个接口,用于表示能够枚举集合的类型,而Array是一个具体的集合类型,用于表示固定大小的数组。
IList和List的区别在于,IList也是一个接口,用于表示可变大小的列表,而List是IList接口的一个具体实现。
生成一个IEnumerable集合是惰性的,即在调用该集合之前不会执行任何代码。下面是一个示例:
public IEnumerableGetTwoInts() { yield return 1; yield return 2; } public void Something() { var twoInts = GetTwoInts(); }
在方法Something中,调用GetTwoInts()并不会实际执行GetTwoInts方法,因为该枚举从未被迭代。
要使该方法被执行,可以将twoInts放入foreach循环中,或者调用twoInts.ToList()方法。
希望能够解决你的疑问。如果还有其他问题,请随时提问。谢谢!
IEnumerable是一个接口,允许通过集合中的项进行迭代(例如通过foreach关键字)。
数组是.NET的内置类型。它保存相同类型的项,但是它的大小是固定的。一旦创建了一个包含x个元素的数组,它就不能增长或缩小。
IList定义了列表的接口,并且实现了IEnumerable。
List实现了IList接口;它是一个具体的列表类型。
.NET列表和数组的区别在于列表可以添加元素 - 它们可以增长到足够大以容纳所有所需的项。列表在内部使用数组来存储这些元素,当数组无法容纳所有元素时,会创建一个新的数组并将元素复制过去。
IList和数组都实现了IEnumerable。这就是接口的工作原理 - 类实现了合约,并以类似的方式行为,因此可以进行类似的处理(您知道类实现了IEnumerable,不需要知道其如何实现)。建议您阅读有关接口等内容的资料。
为那些不阅读所有答案的读者添加此评论:数组和List都实现了IList(数组大部分是显式实现,可能是因为许多成员会引发NotSupportedException异常)。更准确地说,IList继承自IEnumerable,而不是实现它。
IEnumerable和Array的区别在于,IEnumerable只提供了最基本的“可迭代”功能,可以遍历序列,但其他操作如计算元素数量或获取第n个元素则效率较低。而Array是一个固定大小的集合,可以随机访问(即可以通过索引进行访问)。
IList和List的区别在于,List是一个可变大小的集合,可以添加和删除元素,并且可以随机访问。而IList是一个接口,将列表功能(计数、添加、删除、索引访问)抽象出来,与具体的类(如List、BindingList、ObservableCollection等)分离。
根据stackoverflow上的回答,IEnumerable的Count方法几乎与ICollection的Count属性相同,因为它会尝试在ICollection上调用Count方法。Count扩展方法会检查IEnumerable是否也是ICollection,如果是,则调用其Count属性;如果不是,则回退到迭代序列的方式进行计数。因此,使用IEnumerable仅进行计数操作效率较低是因为它无法使用更高效的方法,但如果对象具有更高效的方法,仍然可以使用它们。
为了解决IEnumerable的计数效率低的问题,可以将其转换为其他集合类型,如List或Array,然后使用其相应的计数方法。例如,可以使用ToList()方法将IEnumerable转换为List,然后使用List的Count属性来计数。或者可以使用ToArray()方法将IEnumerable转换为Array,然后使用Array的Length属性来计数。
IEnumerable提供了最基本的迭代功能,而Array和List则提供了更丰富的功能,如随机访问、计数、添加和删除元素等。为了解决IEnumerable计数效率低的问题,可以将其转换为其他集合类型进行操作。