在 VB.NET 中使用 LINQ 的 ForEach 和匿名方法



我正在尝试将经典的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))))

相关内容

  • 没有找到相关文章

最新更新