在 C# 中的列表上使用 IEnumerable [重复]

Posted

技术标签:

【中文标题】在 C# 中的列表上使用 IEnumerable [重复]【英文标题】:using IEnumerable over List in C# [duplicate] 【发布时间】:2017-01-21 23:28:41 【问题描述】:

使用 IEnumerable 比使用 List 有什么优势?例如,我有一个 Employee 类和一个员工对象的集合,如果我想迭代每个员工,我可以使用:

List<Employee> employees = new List<Employee>()  new Employee(...),...
foreach (Employee emp in employees)

   Console.WriteLine(emp.Name);

或者我可以将 Ienumerable 用作:

IEnumerable<Employee> employees = new List<Employee>()  new Employee(...),...

然后使用 foreach 循环。

它们都实现了相同的目标,那么为什么我们有时更喜欢使用 IEnumerable 而不是 List?

【问题讨论】:

【参考方案1】:

List是一种更复杂的结构,可以通过索引访问值,支持insert、add、remove等方法。 IEnumerable 是 List 类也实现的一个非常基本的接口(尽管前几次实现可能会很棘手)。也就是说,当您不需要 List 提供的附加功能时,可以使用 IEnumerable。否则,由于 List 与 IEnumerable 具有“是”关系,由于 c# 提供的逆变规则,您可以使用相同的关系。以下是一些相关文档:

https://msdn.microsoft.com/en-us/library/dd799517.aspx

还有关于 IEnumerable 的实现:

https://msdn.microsoft.com/en-us/library/system.collections.ienumerable(v=vs.110).aspx

总之,如果您需要做的只是使用简单的迭代器(例如 foreach 循环)来循环遍历生成的 IEnumerable,或者使用 LINQ,那么 IEnumerable 类型将非常出色且轻量级。如果您需要更多功能,那么该列表将建立在 IEnumerable 所需的功能之上,因为它是一个 IEnumerable,然后是一些。

【讨论】:

以上是关于在 C# 中的列表上使用 IEnumerable [重复]的主要内容,如果未能解决你的问题,请参考以下文章

IEnumerable<T> 使用 c# 在函数内访问 T 的属性

使用 OrderByDescending 每一步返回 IEnumerable<T> 列表集合中的最大值

C# 使用IEnumerable,yield 返回结果,同时使用foreach时,在循环内修改变量的值无效

C#内建接口:IEnumerable

C# 中是不是有“空列表”单例?

c# IeNumerable 如果没有则返回[重复]