C# code>提取代码仍将运行的属性,但与原始代码具有完全相同的性能特征。没有空间用于存储属性,但它们在每次迭代时都会被解析。“我自己如何着手解决类似的问题”-最好的办法是研究由此代码生成的IL。您可以在Parse()方法上设置调试器断点,并查看它的命中频率。
C# code>提取代码仍将运行的属性,但与原始代码具有完全相同的性能特征。没有空间用于存储属性,但它们在每次迭代时都会被解析。“我自己如何着手解决类似的问题”-最好的办法是研究由此代码生成的IL。您可以在Parse()方法上设置调试器断点,并查看它的命中频率。,c#,.net,linq,clr4.0,C#,.net,Linq,Clr4.0,code>提取代码仍将运行的属性,但与原始代码具有完全相同的性能特征。没有空间用于存储属性,但它们在每次迭代时都会被解析。“我自己如何着手解决类似的问题”-最好的办法是研究由此代码生成的IL。您可以在Parse()方法上设置调试器断点,并查看它的命中频率。4。将光标放在=>之后,然后按F9。这将在lambda中放置一个断点,并在到达它时中断。对每个lambda重复上述操作,您可以很好地跟踪何时调用。@AllonGuralnek这是一个很好的观点,我倾向于忘记中断lambda,因为我通常使用鼠标来
code>提取代码仍将运行的属性,但与原始代码具有完全相同的性能特征。没有空间用于存储属性,但它们在每次迭代时都会被解析。“我自己如何着手解决类似的问题”-最好的办法是研究由此代码生成的IL。您可以在Parse()方法上设置调试器断点,并查看它的命中频率。4。将光标放在
=>
之后,然后按F9。这将在lambda中放置一个断点,并在到达它时中断。对每个lambda重复上述操作,您可以很好地跟踪何时调用。@AllonGuralnek这是一个很好的观点,我倾向于忘记中断lambda,因为我通常使用鼠标来设置它们:)非常感谢关于通过点击F9设置断点的提示。到目前为止,我一直在重新编写代码,在不同的行上使用return语句,然后在那里放置断点。你的方法会节省我很多时间。@Shrederroy,Michel:是的,这是一个有鼠标可发现性问题的功能。Michel,至于你关于光标定位的注释,VS实际上并没有那么挑剔。您可以将光标放置在=>
和lambda末端之间的任意位置,以获得正确的位置(基本上是lambda主体中的任意位置)。事实上,由于lambda只编译为一个方法,您可以通过将光标放在其中一条语句上并点击F9,在其任何一条语句上设置断点,尽管lambda通常只有一条语句或表达式;我遇到的问题是,如果光标位于^here:=>^Int32.Parse,则它位于lambda的“外部”,但如果光标位于^here:=>^Int32.Parse,则它位于“内部”。但我最终得到了:)
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));
var X = XElement.Parse (@"
<ROOT>
<MUL v='2' />
<MUL v='3' />
</ROOT>
")
.Elements ()
.Select (t => Int32.Parse (t.Attribute ("v").Value))
.ToList ();
Enumerable.Range (1, 100)
.Select (s => x.Aggregate (s, (t, u) => t * u))
.ToList ()
.ForEach (s => Console.WriteLine (s));