Shr*_*roy 7 .net c# linq clr4.0
假设我有以下代码:
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));
Run Code Online (Sandbox Code Playgroud)
什么是.NET运行时实际在这里做什么?难道解析和转换属性整数各100次,还是足够聪明弄清楚,它应该缓存解析值,而不是重复计算的范围中的每个元素?
而且,我怎么会自己搞清楚这样的事情呢?
在此先感谢您的帮助.
自从我研究这段代码以来已经有一段时间了,但是,IIRC,Select
有效的方法是简单地缓存Func
您提供的代码并一次在源集合上运行它。Select/Aggregate
因此,对于外部范围中的每个元素,它将像第一次一样运行内部序列。没有任何内置缓存正在进行——您必须自己在表达式中实现它。
如果您想自己解决这个问题,您有三个基本选择:
ildasm
查看IL;它是最准确的,但是,特别是对于 lambda 和闭包,您从 IL 获得的内容可能与您放入 C# 编译器中的内容完全不同。