generics - 解释为什么 IEnumerable 比 List 更高效

标签 generics .net-3.5

我一直听说在 .net 3.5 中你应该使用 IEnumerable 而不是 List,但我找不到任何引用资料或文章来解释为什么它如此熟练。有谁知道有任何内容可以解释这一点吗?

问这个问题的目的是为了更好地了解 IEnumerable 在幕后所做的事情。如果您可以向我提供任何链接,我将进行研究并发布答案。

最佳答案

IEnumerable<T>是一个由List<T>实现的接口(interface)。我怀疑你听到这个的原因 IEnumerable<T>应该使用它是因为它的接口(interface)要求限制较少。

例如,考虑以下方法签名:

void Output(List<Foo> foos) 
{ 
    foreach(var foo in foos) { /* do something */ }
}

此方法要求向其传递 List 的具体实现。但它只是按顺序做一些事情。它实际上并不需要随机访问或 List<T> 所需要的任何其他东西。甚至是IList<T>给它。相反,该方法应该接受 IEnumerable<T> :

void Output(IEnumerable<Foo> foos) 
{ 
    foreach(var foo in foos) { /* do something */ }
}

现在我们使用最通用(最不具体)的接口(interface)来支持我们需要的操作。这是面向对象设计的一个基本方面。我们只需要我们需要的东西,而不需要太多其他东西,从而减少了耦合。我们还创建了一种更灵活的方法,因为 foos参数可能是Queue<T> ,一个List<T>任何实现 IEnumerable<T> 。我们不会强制调用者将其数据结构转换为不必要的列表。

所以不是那样IEnumerable<T>在“性能”或“运行时”方面比列出的效率更高。就是那个IEnumerable<T>是一种更高效的设计构造,因为它更具体地指示您的设计需求。 (尽管这在特定情况下可能会导致运行时间增加。)

关于generics - 解释为什么 IEnumerable 比 List 更高效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1347172/

相关文章:

C#:包含泛型列表的类的 XML 序列化

c++ - 用 Python 生成器替换 C++ STL 输出迭代器

swift 3 : Inheritance from non-named type

c# - 为什么将泛型显式转换为类类型有限制,而将泛型转换为接口(interface)类型没有限制?

asp.net - 如何使用 ASP.NET 用户控件获取设计图面渲染和设计时数据源选择

c# - ComputedVerticalScrollBarVisibility 触发器在使用绑定(bind)/转换器时不起作用

c# - 减少字典中的所有 int 值

java - 用于指定对泛型方法的方法引用的语法

c# - IE9 WebBrowser 控件是否支持 IE9 的所有功能,包括 SVG?

sql - 我可以获得从 LinqDataSource 生成的 T-SQL 查询吗?