Использует linq в этом излишестве ситуации

Я думаю об осуществлении рефакторинг, но я не знаю, является ли конечным результатом просто излишество. В настоящее время я имею

    IList<myobjecttypebase> m_items;

   public int GetIncrementTotal()
   {
     int incrementTot;
     foreach(myobjecttypebase x in m_items)
     { incrementTot += x.GetIncrement(); }
   }

Это было бы излишество и/или менее эффективный для использования linq для ForEach

m_items.ToList().ForEach(x => incrementTot += x.GetIncrement());

Бросок был бы значительными издержками здесь?

8
задан ali62b 3 February 2010 в 10:57
поделиться

6 ответов

Солистский метод представляет собой метод расширения, используемого с LINQ, но метод foreach - это просто метод в классе списка.

Основные накладные расходы здесь - вызов ToList Method, который создает новый список из коллекции. Foreach также имеет небольшой накладной расход, поскольку он должен вызвать делегат для каждого элемента.

Если вы хотите использовать методы LINQ, совокупный метод кажется более подходящим:

public int GetIncrementTotal() {
  return m_items.Aggregate(0, (t, i) => t + i.GetIncrement());
}

или SUM:

public int GetIncrementTotal() {
  return m_items.Sum(i => i.GetIncrement());
}

либо имеет небольшой накладной над вашей оригинальной версией, поэтому, если вы хотите наиболее эффективную, просто придерживайтесь простого петля.

4
ответ дан 5 December 2019 в 08:23
поделиться

Вы хотите [a-z] + [0-9]? , если только эта буквенная последовательность не напоминает одну из sin cos tan ?

\b(?!(sin|cos|tan)(?=\d|\b))[a-z]+\d?\b

не дает результата:

cos   - no match
cosy  - full match
cos1  - no match
cosy1 - full match
bla9  - full match
bla99 - no match
-121--4903941-

Руководство по доступу к устройствам Bluetooth содержит краткий раздел .

-121--3942167-

Накладные расходы будут повторяться дважды.

m_items.ToList() // First iteration to add to the list all the items
   .ForEach(x => incrementTot += x.GetIncrement()); /* Second iteration to
                                                       perform logic */

ToList не выполняет итерацию в ленивых способах, так как большинство инструкций LINQ, поэтому он заставит код выполнить итерацию над коллекцией дважды.

В целом форма LINQ кажется более удобной для чтения, но если вы беспокоитесь о производительности, вам лучше избегать ее.

3
ответ дан 5 December 2019 в 08:23
поделиться

Почему оператор SUM не используется непосредственно на IList?

Он имеет несколько перегрузок с использованием Func делегатов:

m_items.Sum(x => x.GetIncrement());
-121--3572421-

Проверьте этот http://fi.am/entry/adding-a-simple-wysiwym-markdown-editor-to-your-mo/

Это гораздо лучшее решение.

Так просто и ясно.

-121--3181446-

Не делайте так.
ToList () здесь распределяет и заполняет новый список, IMHO не требуется. Хотя это тривиальное упражнение, чтобы написать метод расширения ForEver для итерации над любым объектом, который реализует IEnumberable, я бы посоветовал против этого (см. эту статью Эрика Липперта foreach V 's ForEach ).

Я бы пошел с форехом.

P.S. необходимо инициализировать incrementTot (извините, я не смог помочь себе)

1
ответ дан 5 December 2019 в 08:23
поделиться

ForEvery не является частью LINQ - это часть API List < T > и начиная с .NET 2,0.

Причина, по которой он не является частью LINQ, заключается в том, что это естественный метод побочного воздействия... и LINQ не поощряет побочные эффекты.

Используя Сумму правильное решение здесь, но вы не должны создавать список сначала:

return m_items.Sum(x => x.GetIncrement());
3
ответ дан 5 December 2019 в 08:23
поделиться

Почему бы не использовать оператор SUM непосредственно в списке IList?

У него есть несколько перегрузок с использованием делегатов Func :

m_items.Sum(x => x.GetIncrement());
7
ответ дан 5 December 2019 в 08:23
поделиться

Как уже упоминалось, используйте SUM

incrementTot = m_items.ToList().Sum(x => x.GetIncrement());
2
ответ дан 5 December 2019 в 08:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: