在探索最近的林克问题 https://stackoverflow.com/questions/1582054/handling-temporary-calculation-in-linq我注意到该算法似乎相当慢。深入挖掘后,我注意到这不是 linq 代码,而是随后结果的输出花费了很长时间。 (顺便说一句,感谢 Marc Gravel 踢出了我见过的最流畅的 Linq。)
Code:
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);
Output:
Alg Start 20.257
Alg End 20.270
109989 x 9 = 989901
219978 x 4 = 879912
1099989 x 9 = 9899901
Disp End 31.322
.13 秒计算并超过 11 秒显示?!?这是什么原因呢?
原因是查询在您枚举之前并未实际运行。在 LINQ to 对象中,它只是设置一堆委托,当您迭代枚举器时会调用这些委托。如果您将 ToList() 添加到查询中以具体化它,您会发现所花费的时间将转移到设置并远离显示。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)