Generics - вызов метода для каждого объекта в List <T>
Есть ли способ вызвать метод для каждого объекта в списке - например,
Вместо
List<MyClass> items = setup();
foreach (MyClass item in items)
item.SomeMethod();
Вы можете сделать что-то вроде
foreach(items).SomeMethod();
Что-нибудь встроенное, методы расширения, или я просто слишком чертовски ленив?
Ответы
Ответ 1
Да, на List<T>
есть:
items.ForEach(item => item.SomeMethod())
Нечетность заключается в том, что это доступно только на List<T>
, а не IList<T>
или IEnumerable<T>
Чтобы исправить это, мне нравится добавить следующий метод расширения:
public static class IEnumerableExtensions
{
public static void ForEach<T>(this IEnumerable<T> items, Action<T> action)
{
foreach(var item in items)
action(item);
}
}
Затем вы можете использовать его на НИЧЕГО, что реализует IEnumerable<T>
... не просто List<T>
Ответ 2
items.ForEach(i => i.SomeMethod());
Ответ 3
В списках есть метод ForEach. Вы также можете создать метод расширения IEnumerable, но это как-то противоречит духу Linq.
Ответ 4
Если вам нужно изменить свойство MyClass с помощью MyMethod, используйте метод "Pipe" от Jon Skeet библиотека morelinq
items = items.Pipe<MyClass>(i => i.Text = i.UpdateText()).ToList()
Возможности бесконечны!:)