我想使用 LINQ 对对象列表中的所有对象执行一个函数。我知道我之前在 SO 上看到过类似的东西,但在几次搜索尝试失败后,我发布了这个问题
问问题
7356 次
1 回答
14
如果它实际上是 type ,请尝试以下操作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));
编辑
注意为 VB.Net 使用 .ForEach。您必须选择一个返回值的函数。这是 VB.Net 9 (VS 2009) 中 lambda 表达式的限制。但是有解决办法。假设你想调用一个 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 回答