如何更有效地使方法返回 IList<T>
或 IEnumerable<T>
?
IEnumerable<T>
是不可变集合,IList<T>
是可变集合,且包含许多有用的方法和属性。
将 IList<T>
强制转换为 IEnumerable<T>
只需要进行引用复制:
IList<T> l = new List<T>();
IEnumerable<T> e = l;
要将 IEnumerable<T>
强制转换为 List<T>
,我们需要迭代每个元素或调用 ToList()
方法:
IEnumerable<T>.ToList();
或者可以将 IEnumerable<T>
传递给 List<T>
构造函数,该构造函数会在其内部执行相同的迭代操作。
List<T> l = new List<T>(e);
您认为哪种情况更有效率?在实践中,您更喜欢哪种情况?
IEnumerable<T>
上调用ToList
扩展方法时,这只是创建一个new List<T>
并将可枚举对象提供给构造函数。当然,底层元素不会被复制,因此您只是实例化一个不应占用太多内存的对象。底层可枚举对象是通过引用存储的。 - Darin Dimitrov