LINQ не так уж полезен для выполнения побочных эффектов, он в первую очередь предназначен для запросов .По правде говоря, тот факт, что его отложенное выполнение настолько укоренилось в его поведении, делает его плохим выбором для выполнения побочных эффектов, IMO.
Код, который вы получаете, выглядит прекрасномне.Если вы действительно хотели использовать LINQ, я сомневаюсь, что вы могли бы значительно улучшить:
foreach (var o in obj.Where(i => i.SomeProperty == Something))
{
o.SomeOtherProperty = true;
}
Теперь, это не так уж и лучше (возможно, хуже), чем ваш оригинал.
Вкл.с другой стороны, если вы хотите создать новую, последовательность потоков с проекциями исходных элементов, имеющих желаемые характеристики, вы можете сделать что-то вроде:
var projection = obj.Where(i => i.SomeProperty == Something)
.Select(i => new Foo(i) { SomeOtherProperty = true });
// assuming your type has a copy-constructor
РЕДАКТИРОВАТЬ : Если вы не хотите прислушиваться к советам экспертов (читай: Эрик Липперт), вы можете написать свой собственный метод расширения:
public static void Do<T>(this IEnumerable<T> source, Action<T> action)
{
if (source == null)
throw new ArgumentNullException("source");
if (action == null)
throw new ArgumentNullException("action");
foreach (T item in source)
action(item);
}
Это будетпозволяют сделать:
obj.Where(o => o.SomeProperty == Something)
.Do(o => o.SomeOtherProperty = true);