Агрегация объектов LINQC#

Место общения программистов C#
Anonymous
Агрегация объектов LINQ

Сообщение Anonymous »

Я часто вижу этот фрагмент кода в качестве примера агрегирования перечислимых объектов в C#:

Код: Выделить всё

IEnumerable myObjects = new List()
{new MyCoolObject(){Value1=1, Value2=10}, new MyCoolObject(){Value1=2, Value2=20}};
MyCoolObject aggregatedObject = myObjects.Aggregate(new MyCoolObject(), (accumlator, next) => new MyCoolObject()
{
Value1=accumlator.Value1 + next.Value1,
Value2=accumlator.Value2 + next.Value2
}
Моя проблема с этим подходом заключается в том, что он создает новый MyCoolObject на каждой итерации, что кажется огромной тратой.
Другой распространенный пример:

Код: Выделить всё

MyCoolObject aggregatedObject = new MyCoolObject()
{
Value1=myObjects.Sum(x=>x.Value1),
Value2=myObjects.Sum(x=>x.Value2)
}
Этот метод повторяет мою коллекцию дважды, что тоже является большой тратой, особенно если в моих объектах нужно агрегировать больше полей.
Я решил, что могу сделать следующее:

Код: Выделить всё

MyCoolObject aggregatedObject = myObjects.Aggregate(new MyCoolObject(), (accumlator, next) =>
{
accumlator.Value1 += next.Value1;
accumlator.Value2 += next.Value2;
return accumlator;
};
Этот объект создает один объект-аккумулятор, работает с ним и возвращает его по завершении. На мой взгляд, это похоже на производительность ручного цикла foreach.
Я удивлен, что не часто вижу это решение. Есть ли какие-либо проблемы, которые может вызвать это решение и которые могли бы это объяснить?

Вернуться в «C#»