迭代Linq结果时出现奇怪的缓慢

Pau*_*sik 3 c# linq

在探索最近的Linq问题时,我注意到算法似乎相当慢.深入挖掘我注意到它不是linq代码,但结果的输出后来耗费了很长时间.(感谢Marc Gravel顺便说一句,我已经看过了最简单的Linq.)

码:

        DateTime dt = DateTime.Now;
        Console.WriteLine("Alg Start " + dt.Second + "." + dt.Millisecond);

        var qry = from l in Enumerable.Range(100000, 999999)
                  let s = l.ToString()
                  let sReversed = new string(s.Reverse().ToArray())
                  from i in Enumerable.Range(3, 9)
                  let t = (l * i).ToString()
                  where t == sReversed
                  select new { l, i };

        dt = DateTime.Now;
        Console.WriteLine("Alg End " + dt.Second + "." + dt.Millisecond);

        foreach (var row in qry)
            Console.WriteLine("{0} x {1} = {2}", row.l, row.i, row.l * row.i);

        dt = DateTime.Now;
        Console.WriteLine("Disp End " + dt.Second + "." + dt.Millisecond);
Run Code Online (Sandbox Code Playgroud)

输出:

Alg Start 20.257
Alg End   20.270
109989 x 9 = 989901
219978 x 4 = 879912
1099989 x 9 = 9899901
Disp End  31.322
Run Code Online (Sandbox Code Playgroud)

.13秒计算和超过11来显示?!?这是什么原因?

Lee*_*Lee 5

linq查询似乎快速执行的原因是因为linq使用延迟执行,所以在定义点上实际上没有计算任何内容,即在您开始枚举结果之前不会执行"实际"工作.


tva*_*son 5

原因是在枚举之前查询实际上不会运行.在LINQ to对象中,它只是设置了一堆代理,当你遍历枚举器时会被调用.如果您要在查询中添加ToList()以实现它,您会看到所花费的时间将转移到设置并远离显示.