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

Posted

技术标签:

【中文标题】在 VB.NET 中使用带有匿名方法的 LINQ 的 ForEach【英文标题】:Using LINQ's ForEach with anonymous methods in VB.NET 【发布时间】:2011-08-26 07:46:09 【问题描述】:

我正在尝试用 VB.NET 中的 LINQ ForEach 扩展替换经典的 For Each 循环...

  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 ???

如何使用匿名方法(即不声明新函数)正确地做到这一点?

【问题讨论】:

【参考方案1】:

而不是使用.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() 添加到上述代码示例的末尾即可。

【讨论】:

【参考方案2】:

如果您希望内联表达式返回一个值,您将使用函数。例如:

Dim myProduct = repository.Products.First(Function(p) p.Id = 1)

这将使用函数表达式,因为它的计算结果为布尔值 (p.Id = 1)。

您需要使用 Sub,因为表达式没有返回任何内容:

singles.ForEach(Sub(s) integers.Add(CInt(Math.Round(s))))

【讨论】:

第一个代码看不懂...终于有了Dim myProduct = false ? 不......它是内部函数评估为布尔值,外部函数产生一个产品。试图显示两种用途之间的区别; First() 方法采用谓词过滤器,该过滤器将每个项目评估为真/假——在这种情况下,通过 Id 查找项目。 ForEach 运算符迭代执行一个操作但不返回任何内容。【参考方案3】:

试试这个:

singles.ForEach(Sub(s As [Single]) integers.Add(CInt(Math.Round(s))))

这里需要Sub,因为For Each 循环的主体不会返回值。

【讨论】:

以上是关于在 VB.NET 中使用带有匿名方法的 LINQ 的 ForEach的主要内容,如果未能解决你的问题,请参考以下文章

在带有 LINQ to XML 的 VB.NET 中,where 子句在属性值和字符串之间设置不区分大小写的比较

vb.net 中 LINQ 的新手问题

LINQ .Startswith 或 .Contains VB.NET4 中的问题

VB.Net Linq to Entities Null 比较 - “啥都没有”或“= 啥都没有”?

如何在 vb.net 中打印带有标题的 datagridview 表?

在值中搜索字符串并在 VB.NET 中的 LINQ to XML 中获取属性值