Я думаю об осуществлении рефакторинг, но я не знаю, является ли конечным результатом просто излишество. В настоящее время я имею
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());
Бросок был бы значительными издержками здесь?
Солистский метод представляет собой метод расширения, используемого с 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());
}
либо имеет небольшой накладной над вашей оригинальной версией, поэтому, если вы хотите наиболее эффективную, просто придерживайтесь простого петля.
Вы хотите [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 кажется более удобной для чтения, но если вы беспокоитесь о производительности, вам лучше избегать ее.
Почему оператор 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 (извините, я не смог помочь себе)
ForEvery
не является частью LINQ - это часть API List < T >
и начиная с .NET 2,0.
Причина, по которой он не является частью LINQ, заключается в том, что это естественный метод побочного воздействия... и LINQ не поощряет побочные эффекты.
Используя Сумму правильное решение здесь, но вы не должны создавать список сначала:
return m_items.Sum(x => x.GetIncrement());
Почему бы не использовать оператор SUM непосредственно в списке IList?
У него есть несколько перегрузок с использованием делегатов Func
:
m_items.Sum(x => x.GetIncrement());
Как уже упоминалось, используйте SUM
incrementTot = m_items.ToList().Sum(x => x.GetIncrement());