Лично, если вы хотите обновить список вместо , я бы просто использовал простой цикл.Следовать и поддерживать будет намного проще:
for (int i=0;i<list.Count;++i)
{
if (list[i].ShouldCalculate)
list[i] = list[i].Calculate();
}
Это, по крайней мере, гораздо более очевидно, что оно будет обновляться.LINQ рассчитывает выполнить запрос , не изменяя данные.
Если вы действительно хотите использовать LINQ для этого, вы можете - но ему все равно потребуется копия, есливы хотите иметь List<T>
в качестве результатов:
myList = myList.Select(f => f.ShouldCalculate ? f.Calculate() : f).ToList();
Это вызовет ваш метод Calculate()
при необходимости и скопирует оригинал, когда он не нужен.Для создания нового List<T>
требуется копия, хотя, как вы упомянули, это было требованием (в комментариях).
Однако в этом случае я бы предпочел использовать цикл.Я нахожу намерение намного более ясным - плюс, вы избегаете ненужной операции копирования.
Редактирование # 2:
Учитывая этот комментарий:
Ои просто усложнять вещи!список (на данный момент) имеет анонимный тип из пары запросов linq
Если вы действительно хотите использовать синтаксис стиля LINQ, я бы рекомендовал просто не вызывать ToList()
в исходных запросах,Если вы оставите их в их исходной форме IEnumerable<T>
, вы легко сможете выполнить мой второй вариант, описанный выше, но для исходного запроса:
var myList = query.Select(f => f.ShouldCalculate ? f.Calculate() : f).ToList();
Преимущество этого состоит в том, что список создается только один раз, ипредотвращение копирования, так как исходная последовательность не будет оценена до этой операции.