2011-04-06 2 views
2

Привет,Как создать метод расширения с лямбда-выражения

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

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

в

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

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

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

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

+0

Там нет " Lambda Extension ", вы объединили 2 понятия в одном:« Лямбда-выражение »и« Методы расширения ». – digEmAll

+0

Правда, но я искал способ реализовать лямбда в расширении. Но похоже, что уже есть метод, который делает то, что я хочу. –

+0

шахта была просто разъяснением. Чтобы быть более точным, заголовок должен был быть «Как создать метод расширения с использованием лямбда-выражения». Ваша цель была ясна, хотя :) – digEmAll

ответ

6

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

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

Если Events является IEnumerable, ForEach не реализована, но вы, конечно, можете сделать свой собственный ForEach, который работает на IEnumerable самостоятельно. Причина: ForEach не создано для IEnumerable, является то, что they did not want to have extension method on IEnumerable with side effects (что изменило оригинальную коллекцию).

Реализация 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 класс так же, как и все другие методы расширения.

+0

@ Kirk Woll - ссылка на блог Эрика Липперта очень часто является хорошей идеей :) –

2

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

Events.ToList().ForEach(Event => Event.SomeId = 0); 
2

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

Events.ForEach(e => e.SomeId = 0); 
1

Если события является список, вы не могли бы сделать:

Events.ForEach(m => m.SomeId = 0); 
Смежные вопросы