как выполнить функцию в списке объектов с помощью LINQ - PullRequest
3 голосов
/ 08 мая 2009

Я хочу выполнить функцию для всех объектов в Списке объектов, используя LINQ. Я знаю, что видел что-то похожее на SO раньше, но после нескольких неудачных попыток поиска я задаю этот вопрос

1 Ответ

14 голосов
/ 08 мая 2009

Попробуйте следующее, если оно действительно имеет тип List<T>.

C #

var list = GetSomeList();
list.ForEach( x => SomeMethod(x) );
' Alternatively
list.ForEach(SomeMethod);

VB.Net

Dim list = GetSomeList();
list.ForEach( Function(x) SomeMethod(x) );

К сожалению .ForEach определен только для List<T>, поэтому его нельзя использовать с любым общим типом IEnumerable<T>. Хотя такую ​​функцию легко закодировать

C #

public static void ForEach<T>(this IEnumerable<T> source, Action<T> del) {
  foreach ( var cur in source ) {
    del(cur);
  }
}

VB.Net

<Extension()> _
Public Sub ForEach(Of T)(source As IEnumerable(Of T), ByVal del As Action(Of T)
  For Each cur in source
    del(cur)
  Next
End Sub

При этом вы можете запустить .ForEach на любом IEnumerable<T>, что делает его пригодным для использования практически с любым запросом LINQ.

var query = from it in whatever where it.SomeProperty > 42;
query.ForEach(x => Log(x));

EDIT

Примечание для использования .ForEach для VB.Net. Вы должны выбрать функцию, которая возвращает значение. Это ограничение лямбда-выражений в VB.Net 9 (VS 2009). Но есть работа вокруг. Скажем, вы хотите вызвать SomeMethod, который является Sub. Просто создайте оболочку, которая возвращает пустое значение

Sub SomeMethod(x As String) 
  ... 
End Sub

Function SomeMethodWrapper(x As String)
  SomeMethod(x)
  Return Nothing
End Function

list.ForEach(Function(x) SomeMethod(x)) ' Won't compile
list.ForEach(function(x) SomeMethodWrapper(x)) ' Works
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...