在LINQ结果上将IEnumberable <T>转换为List <T>,导致巨大的性能损失

Fil*_*erg 1 c# linq generics .net-4.0 c#-4.0

在LINQ结果上你喜欢这样:

var result = from x in Items select x;
List<T> list = result.ToList<T>();
Run Code Online (Sandbox Code Playgroud)

但是,ToList<T>它真的很慢,是否会使列表变得可变,因此转换速度很慢?

在大多数情况下,我可以设法只使用我的IEnumerableParalell.DistinctQuery现在,但现在我想将项目绑定到DataGridView,因此我需要作为其他东西IEnumerable,建议如何获得ToList或任何替换的性能?

在10亿的记录中IEnumerable,.ToList<T>大约需要6秒钟.

Meh*_*ari 10

.ToList()什么慢?

如果你在比较

var result = from x in Items select x;
List<T> list = result.ToList<T>();
Run Code Online (Sandbox Code Playgroud)

var result = from x in Items select x;
Run Code Online (Sandbox Code Playgroud)

你应该注意,由于查询被懒惰地评估,第一行根本没有做太多.它不会检索任何记录.延迟执行使得这种比较完全不公平.

  • @Filip:检索大量项目的工作量非常高.为了显着提高性能,您必须更改问题的高级方法,以便*首先不需要检索该数量的数据*. (3认同)

Mar*_*ers 7

这是因为LINQ喜欢懒惰并尽可能少地工作.这一行:

var result = from x in Items select x;
Run Code Online (Sandbox Code Playgroud)

尽管您选择了名称,但实际上并不是结果,它只是一个查询对象.它不会获取任何数据.

List<T> list = result.ToList<T>();
Run Code Online (Sandbox Code Playgroud)

现在您实际上已经请求了结果,因此它必须从源中获取数据并制作它的副本.ToList保证制作副本.

考虑到这一点,第二条线比第一条线慢得多并不奇怪.