IEnumerable和Array,IList和List之间有什么区别?

cha*_*hat 87 c#

IEnumerable和之间有什么区别Array

IList和之间有什么区别List

这些似乎具有相同的功能.

ito*_*son 97

IEnumerable仅提供最小的"可迭代"功能.你可以遍历序列,但这就是它.这有缺点 - 例如,使用IEnumerable计算元素或获取第n个元素是非常低效的 - 但它也有优点 - 例如,IEnumerable可能是无穷无尽的序列,如素数序列.

Array是一个固定大小的集合,具有随机访问权限(即您可以将其编入索引).

List是一个可变大小的集合(即你可以添加和删除元素)随机访问.

IList是一个接口,它将列表功能(计数,添加,删除,索引器访问)从List,BindingList,ObservableCollection等各种具体类中抽象出来.

  • 是的,不是.Count()扩展方法检查IEnumerable是否也是ICollection,如果是,则调用其Count属性.如果IEnumerable*不是*ICollection,那么Count()会回退到迭代序列.也许我应该说"使用**IEnumerable来计算元素是非常低效的",因为当然IEnumerable的存在并不会阻止你使用更有效的方法,如果对象有一个,并且LINQ to Objects扩展方法做到这一点. (14认同)
  • 根据接受的答案http://stackoverflow.com/questions/1826658/what-is-faster-or-preferred-ienumerable-toarray-or-tolist.依靠IEnumerable几乎是相同的,因为它试图在ICollection上调用Count (2认同)

Mar*_*son 16

IEnumerable是一个允许迭代项集合的接口(例如,通过foreach关键字).

数组是.NET内在函数.它包含相同类型的项目,但它具有固定的大小.使用x元素创建数组后,它无法增长或缩小.

IList定义列表的接口,并实现IEnumerable.

List实现IList接口; 它是一种具体的清单.

.NET列表和数组之间的区别在于列表可以添加元素 - 它们会变得足够大以容纳所有必需的项目.该列表在内部将其存储在一个数组中,当数组不再大到可以容纳所有元素时,将创建一个新数组并复制项目.

IList和数组都实现了IEnumerable.这就是接口工作的方式 - 类实现契约并以类似的方式运行,并且可以作为结果进行类似处理(您知道该类实现IEnumerable,您不需要知道方法或者为什么).我建议你阅读界面等等.


jfc*_*tte 10

IEnumerable和IList是接口.数组和列表是类.Array实现IEnumerable.List实现IList,它扩展了IEnumerable.

编辑:正如itowlson在评论中提到的,Array也实现了IList.

  • Array还实现了IList. (4认同)

row*_*ow1 6

生成IEnumerable集合是懒惰的.例:

public IEnumerable<int> GetTwoInts()
{
  yield return 1;
  yield return 2;
}
public void Something()
{
  var twoInts = GetTwoInts();
}
Run Code Online (Sandbox Code Playgroud)

在方法Something中,对GetTwoInts()的调用实际上不会导致执行GetTwoInts方法,因为枚举永远不会被迭代.