3

LINQ を使用して、オブジェクトのリスト内のすべてのオブジェクトに対して関数を実行したいと考えています。以前にSOで似たようなものを見たことは知っていますが、検索に何度か失敗した後、この質問を投稿しています

4

1 に答える 1

14

それが実際にタイプである場合は、以下を試してください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

IEnumerable<T>これを使用すると、実質的にすべてのLINQクエリから使用できるようにする任意のファイルで.ForEachを実行できます。

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

編集

.ForEachforVB.Netを使用することに注意してください。値を返す関数を選択する必要があります。これは、VB.Net 9(VS 2009)のラムダ式の制限です。しかし、回避策があります。SubであるSomeMethodを呼び出したいとします。空の値を返すラッパーを作成するだけです

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
于 2009-05-08T19:19:17.637 に答える