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));