Я работаю с LINQ для объектов и имею функцию, где в некоторых случаях мне нужно изменить базовую коллекцию до вызова Aggregate(...)
, а затем вернуть ее в исходное состояние до того, как funciton вернет результаты Aggregate(...)
. Мой текущий код выглядит примерно так:
bool collectionModified = false;
if(collectionNeedsModification)
{
modifyCollection();
collectionModified = true;
}
var aggregationResult = from a in
(from b in collection
where b.SatisfysCondition)
.Aggregate(aggregationFunction)
select a.NeededValue;
if(collectionModified)
modifyCollection();
return aggregationResult;
Однако, как написано, если я изменю коллекцию, я получу неправильный результат, потому что я возвращаю коллекцию в исходное состояние до того, как будет перечислено значение aggregationResult
, а результаты LINQ будут оценены с ленивом. Моим текущим решением является использование .ToArray()
в моем запросе LINQ следующим образом:
var aggregationResult = (from a in
(from b in collection
where b.SatisfysCondition)
.Aggregate(aggregationFunction)
select a.NeededValue).ToArray();
Размер результирующего массива всегда будет небольшим (< 100 элементов), поэтому время памяти/обработки не вызывает беспокойства. Является ли это лучшим способом обработки моей проблемы или есть лучший способ принудительно оценить запрос LINQ?