我正在尝试将经典的For Each
循环替换为 LINQ ForEach
扩展 VB.NET...
Dim singles As New List(Of Single)(someSingleList)
Dim integers As New List(Of Integer)
For Each singleValue In singles
integers.Add(CInt(Math.Round(singleValue)))
Next singleValue
也许是这样的?
singles.ForEach(Function(s As [Single]) Do ???
如何使用匿名方法正确执行此操作(即不声明新函数)?
试试这个:
singles.ForEach(Sub(s As [Single]) integers.Add(CInt(Math.Round(s))))
这里需要一个Sub
,因为For Each
循环的主体不返回值。
相反,使用 .ForEach
扩展方法,您可以通过这种方式直接生成结果:
Dim integers = singles.Select(Function(x) Math.Round(x)).Cast(Of Integer)()
或者不使用.Cast
,像这样:
Dim integers = singles.Select(Function(x) CInt(Math.Round(x)))
它使您不必预先声明List(Of Integer)
,而且我还认为更清楚的是,您只是在应用转换并产生结果(这在作业中很清楚)。
注意:这产生了一个IEnumerable(Of Integer)
,可以在大多数使用List(Of Integer)
的地方使用......但你不能添加它。如果你想要一个List
,只需在上面的代码示例末尾附加.ToList()
即可。
如果您希望内联表达式返回值,则可以使用函数。例如:
Dim myProduct = repository.Products.First(Function(p) p.Id = 1)
这将使用函数表达式,因为它的计算结果为布尔值 (p.Id = 1)。
您需要使用 Sub,因为表达式不返回任何内容:
singles.ForEach(Sub(s) integers.Add(CInt(Math.Round(s))))