【问题标题】:What is the LINQ Any Query in VB.NET?VB.NET 中的 LINQ Any Query 是什么?
【发布时间】:2019-10-17 14:32:35
【问题描述】:

我想检查一个 DataTable 是否包含某个字符串,然后返回 true 或 false - 在 C# 中我只会使用以下代码,但我不确定它在 vb.net 中是如何工作的

 var bool = dt.AsEnumerable().Any(x => x.Field<string>("Name") == "Tobi");

【问题讨论】:

  • Dim bool As Boolean = dt.AsEnumerable().Any(Function(x) x.Field(Of String)("Name") = "Tobi")

标签: c# .net vb.net linq datatable


【解决方案1】:

你可能想看看Lambda Expressions in VB.NET

相当于你的陈述是:

Dim result = dt.AsEnumerable().Any(Function(x) x.Field(Of String)("Name") = "Tobi")

LINQ 扩展在 C# 和 VB.NET 之间应该具有相同性,因为它们都来自同一个基类库。 lambda 和泛型的语法将是您的主要区别。

【讨论】:

  • 也可以考虑改用String.Compare,这样会更准确。
  • @JohnPete22 String.Equals 可能是更好的选择。
  • 可能。我提到使用比较的唯一原因是您可能要比较的文化可能不同,而且如果您愿意,您可以忽略大小写。实际上,这并不是一个巨大的差异。在比较两个字符串时,我只是倾向于使用比较方法。
  • @JohnPete22 Equals 有一个重载,允许使用相同的 StringComparison 选项。
【解决方案2】:

这就是我要做的。确保您还明确将结果声明为布尔值,仅使用 Object 不是一个好习惯。

这只是一种选择。我倾向于经常使用 SingleOrDefault(),但您也可以轻松使用 Any()(您只需在最后摆脱空检查)

Dim result As Boolean = dt.AsEnumerable().SingleOrDefault(Function(r) String.Compare(r.Item("Name"), "Tobi", StringComparison.InvariantCultureIgnoreCase) = 0) IsNot Nothing

【讨论】:

  • 省略As Boolean 通常没有区别,因为类型将被推断为Boolean(假设默认为Option Infer On)。
  • 你不只是让它在运行时确定然后类型是什​​么?我们假设它将使用正确的类型,这很可能会。但如果类型不匹配,我宁愿明确并在编译时确定问题。
  • 不,您不会让它在运行时确定。您将其留给编译器根据右侧表达式的类型来确定类型。我发现不手动提供类型的便利性通常超过周围代码取决于特定类型的小机会(类型推断仍然会使变量类型为Boolean,因此您不必担心它被视为Object) 但 YMMV。
  • 我发现当我强制编译器输出我想要的类型时,我犯的错误更少。它可以很好地检查表达式是否确实导致了我想要的类型。
猜你喜欢
  • 2014-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-27
  • 1970-01-01
  • 2012-05-19
  • 2017-05-13
相关资源
最近更新 更多