【问题标题】:IList<T> vs IEnumerable<T>. What is more efficient IList<T> or IEnumerable<T>IList<T> 与 IEnumerable<T>。什么是更有效的 IList<T> 或 IEnumerable<T>
【发布时间】:2010-08-21 06:20:40
【问题描述】:

让方法返回IList&lt;T&gt;IEnumerable&lt;T&gt; 的更有效方法是什么?

IEnumerable&lt;T&gt; 是不可变集合,但IList&lt;T&gt; 是可变集合,包含很多有用的方法和属性。

IList&lt;T&gt; 转换为IEnumerable&lt;T&gt; 只是参考副本:

IList<T> l = new List<T>();
IEnumerable<T> e = l;

要将IEnumerable&lt;T&gt; 转换为List&lt;T&gt;,我们需要迭代每个元素或调用ToList() 方法:

IEnumerable<T>.ToList(); 

或者可以将IEnumerable&lt;T&gt; 传递给List&lt;T&gt; 构造函数,该构造函数在其构造函数的某处执行相同的迭代。

List<T> l = new List<T>(e);

您认为哪种情况更有效?在您的实践中您更喜欢哪个?

【问题讨论】:

    标签: c# .net c#-4.0


    【解决方案1】:

    就效率而言,两者都是接口,因此效率将取决于您返回的实际具体类。根据经验,您应该始终返回对象层次结构中适用于该方法的使用者的最高类型。在你的情况下IEnumerable&lt;T&gt;。如果类的消费者需要添加元素、按索引访问元素、删除元素,最好使用IList&lt;T&gt;

    在编程中一如既往:这取决于 :-)

    【讨论】:

    • 例如,如果我实现了返回 'IEnumerable' 的方法,然后在另一个开发阶段我可能需要提升 'IList' 在这种情况下我需要强制转换 'IEnumerable' 到 'IList'。我也可以复制这个方法来创建一个返回'IList'的新方法。但我不认为复制是一个好的选择。但是要从 'IEnumerable' 转换为 'IList' 它只是引用复制另一种方式 'IList' 到 'IEnumerable' 它是每个元素的副本。但是创建 'IList' 需要更多资源,而不是创建 'IEnumerable'。
    • 不,那些是接口。它们只是不占用任何资源的合约。只有具体的类才会占用资源。当您在 IEnumerable&lt;T&gt; 上调用 ToList 扩展方法时,这只会创建一个 new List&lt;T&gt; 并将枚举提供给构造函数。当然,底层元素不会重复,因此您只是在实例化一个不应该占用太多内存的对象。底层枚举是通过引用存储的。
    • 是的,我同意,“总是返回对象层次结构中最高的类型”,这绝对是它应该的方式。我想这就是这个问题的答案。
    • 是的,我有点搞混了。要从 'List' 转换为 'IEnumerable' 它只是引用复制另一个,但将 'IEnumerable' 转换为 'List' 它是每个元素的副本。但是返回 'IList' 的方法需要更多资源,而不是返回 'IEnumerable' 的方法
    猜你喜欢
    • 2012-05-28
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    相关资源
    最近更新 更多