【发布时间】:2009-06-22 16:49:56
【问题描述】:
我正在使用一些 LINQ 选择内容来创建一些集合,这些集合返回 IEnumerable<T>。
就我而言,我需要一个List<T>,所以我将结果传递给List<T> 的构造函数来创建一个。
我想知道这样做的开销。我收藏的物品通常以数百万计,所以我需要考虑这一点。
我假设,如果IEnumerable<T> 包含ValueTypes,这是最差的性能。
我说的对吗? Ref 类型呢?无论哪种方式,都需要调用List<T>.Add 一百万次的成本,对吧?
有什么办法解决这个问题吗?就像我可以使用扩展方法“重载” LINQ Select 这样的方法吗?
【问题讨论】:
-
为什么需要一个包含一百万个项目的列表?除了枚举之外,您的调用者还会做其他事情吗?如果没有,那么调用者可能需要更改为使用 IEnumerable
. -
因为我有 1M+ 件或更多。我没有编写主 API,但这里和那里都有一些索引。
-
@Joan:我只是建议他们重新考虑他们是否真的需要一次将所有数百万个项目都存储在内存中的问题。例如,最好将它们留在数据库中,或者一次性完成所有处理,允许它们留在 IEnumerable 中。列表在构建后是否真的被修改过?
-
基本上当我有列表时,我必须创建一个新的子列表并修改它们。就像:10M 元素 -> 变成 1M -> 做一些操作 -> 结果列表。元素是不可变的,在得到我想要的结果后我就去掉了列表,以及这个例子的比喻数量。
-
@Joan:如果他们不使用 List
超出 IEnumerable 的功能,那么他们当然应该重构。这就是 ReSharper 付出的代价:它会告诉您可以使用基类或接口的方法。
标签: c# .net linq performance ienumerable