Не совсем уверен, почему вы хотите пойти на все эти усилия, когда linq сделает большинство за вас:
IEnumerable<Person> somePeople; // from wherever
somePeople.Where(x => x.CreateDate < new DateTime(2000,1,1))
.ForEach(x => x.PersonClassification = "Online");
Просто добавив ForEach из здесь , отметив, почему он не включен по умолчанию.
Если вы хотите сделать WhereCreatedBefore более привлекательным, просто добавьте следующее расширение:
static class PersonExtensions
{
public static bool WhereCreatedBefore(this Person p,
int year, int month, int day)
{
return p.CreateDate < new DateTime(year,month,day);
}
}
, который полезен сам по себе и дает вам:
somePeople.Where(x => x.CreatedBefore(2000,1,1))
.ForEach(x => x.PersonClassification = "Online");
Зачем ограничивать себя, когда просто расширяешь инструменты, которые дает linq, облегчает жизнь.
Если вы хотите объединить несколько побочных эффектов, просто измените ForEach следующим образом:
public static IEnumerable<T> Modify<T>(
this IEnumerable<T> input, Action<T> action)
{
foreach (var x in input)
{
action(x);
yield return x;
}
}
давая вам:
somePeople.Where(x => x.CreatedBefore(2000,1,1))
.Modify(x => x.PersonClassification = "Online");
.Modify(x => x.LastModifiedBy = Environment.UserName);
Или, если вы используете его интегрированную с языком часть:
(from p in somePeople where p.CreatedBefore(2000,1,1)) select p)
.Modify(p => p.PersonClassification = "Online");
.Modify(p => p.LastModifiedBy = Environment.UserName);
ЕСЛИ вы действительно * хотели, чтобы вы могли написать расширение ClassifyAs следующим образом:
public static IEnumerable<Person> ClassifyAs(
this IEnumerable<Person> input, string classification)
{
foreach (var p in input)
{
p. PersonClassification = classification;
yield return p;
}
}
давая вам оригинал:
(from p in input where p.CreatedBefore(2000,1,1)) select p).ClassifyAs("Online");
Который является одним вкладышем! без каких-либо причудливых структур или иерархий типов, просто некоторые полезные методы расширения.
Linq обычно хорошо спроектирован, хорошо реализован, вездесущ и хорошо интегрирован в c #. Реализовать части запроса в нем было бы глупо и расточительно. Вам нужно добавить побочный эффект, вызывающий операции с ним. Это нормально (у вас есть изменяемые объекты, так что это вряд ли вызывает проблемы), просто добавьте эти операции. Просто заставляя их продолжать приносить свой вклад, вы сделаете ваш код свободным в стиле.