LINQ堆栈大小问题

时间:2012-03-29 22:50:02

标签: performance linq delegates

我有一个问题,在我的公司中,我们使用Toxicity报告来测量静态代码,使用反射器代码度量作为Toxicity Report工具的输入,显然我可以看到代码的反汇编程序。我正在使用LINQ to Objects和XML来使我的代码清晰,但我开始面临一些堆栈大小问题。我看到了反汇编代码,我开始看到我在其中包含“where”linq子句,它生成了一个委托,并且还创建了一个方法,显然增加了我的堆栈大小,因为它创建了更多的方法。有谁知道我怎么能摆脱代表?这是一个例子:

源代码:

List<XElement> toolPnP = 
(from c in xPnpInfo.Descendants("assignedSupport")
 where c != null
 select c).ToList();

反汇编代码:

List<XElement> toolPnP = xPnpInfo.Descendants((XName) ("assignedSupport")).Where<XElement>(delegate (XElement c) {
 return (c != null);
 }).ToList<XElement>();

这些代表指的是:

[CompilerGenerated]
private static bool <.ctor>b__2(XElement c)
{
    return (c != null);
}

我怎么能摆脱这一点,任何建议都会受到欢迎。

1 个答案:

答案 0 :(得分:1)

除了简单的snarky回答(Descendents属性不会给你null结果,所以你不需要测试它),没有...你不能使用linq的没有方法调用的地方。 / p>

编译器将调用位置转换为需要方法引用的System.Linq.Enumerable.Where。如果你不喜欢编译器生成的方法,你可以自己编写方法,但如果你在哪里使用,必须有一个方法。

Func<XElement, bool> myFunc = this.FilterMethod;
List<XElement> result = xPnpInfo.Descendants("assignedSupport")
  .Where(myFunc)
  .ToList();

...

public bool FilterMethod(XElement source)
{
  return source != null;
}