Как создать метод расширения, принимающий лямбда-выражение - PullRequest
2 голосов
/ 06 апреля 2011

Привет,

Я ищу способ конвертировать

foreach (var sEvent in Events)
{
    sEvent.SomeId = 0;
}

в

Events.Set(m=>m.SomeId, 0); 

или что-то в этом роде.

Так что в основном я хочу сделать это событие одной строкой, которое устанавливает все «SomeId» на 0;

Есть ли способ?

Ответы [ 4 ]

6 голосов
/ 06 апреля 2011

Если Events - List<T>, вы можете использовать:

Events.ForEach( m => m.SomeId = 0 );

Если Events - IEnumerable, ForEach не реализовано, но вы, конечно, можете создать свой собственный ForEachэто работает на IEnumerable самостоятельно.Причина, по которой ForEach не создан для IEnumerable, заключается в том, что они не хотели иметь метод расширения для IEnumerable с побочными эффектами (который изменил исходную коллекцию).

Реализация ForEach в IEnumerable достаточно проста:

public static IEnumerable<T> ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
  foreach (T element in source) 
    action(element);
  return source;
}

Это должно входить в класс static, как и все другие методы расширения.

2 голосов
/ 06 апреля 2011

Если Events является List<T>, вы можете просто использовать

Events.ForEach(e => e.SomeId = 0);
2 голосов
/ 06 апреля 2011

Вы можете сделать это

Events.ToList().ForEach(Event => Event.SomeId = 0);
1 голос
/ 06 апреля 2011

Если события - это список, вы можете сделать:

Events.ForEach(m => m.SomeId = 0);
...