Проблемы с размером стека LINQ - PullRequest
0 голосов
/ 30 марта 2012

У меня один вопрос, в моей компании мы используем отчет о токсичности для измерения статического кода, используя метрику кода отражателя в качестве входных данных для инструмента отчета о токсичности, и, очевидно, я вижу дизассемблер кода. Я использую 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 Ответ

1 голос
/ 30 марта 2012

Если не считать банально-странного ответа (свойство Descendents не даст вам нулевых результатов, поэтому вам не нужно это проверять), нет ... вы не можете использовать linq там, где нет вызова метода.

Компилятор переводит куда для вызова 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...