c# – LINQ缓存计算值吗?
假设我有以下代码:
var X = XElement.Parse (@" <ROOT> <MUL v='2' /> <MUL v='3' /> </ROOT> "); Enumerable.Range (1,100) .Select (s => X.Elements () .Select (t => Int32.Parse (t.Attribute ("v").Value)) .Aggregate (s,(t,u) => t * u) ) .ToList () .ForEach (s => Console.WriteLine (s)); 什么是.NET运行时实际在这里做什么?它是解析并将属性转换为100次中的每一个整数,还是足够智能,以确定它应该缓存解析的值而不重复该范围中每个元素的计算? 而且,我怎么会自己搞清楚这样的事情呢? 在此先感谢您的帮助. 解决方法
自从我挖掘这段代码以来已经有一段时间了,但是,IIRC,Select工作的方式就是简单地缓存你提供它的Func并一次在源集合上运行它.因此,对于外部范围中的每个元素,它将运行内部Select / Aggregate序列,就像它是第一次一样.没有任何内置缓存 – 您必须在表达式中自己实现.
如果你想自己解决这个问题,你有三个基本选择: >编译代码并使用ildasm查看IL;它是最准确的,特别是对于lambdas和闭包,你从IL获得的东西可能看起来与你放入C#编译器的东西完全不同. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |