【问题标题】:VB.NET LINQ query disregarding string casingVB.NET LINQ 查询不考虑字符串大小写
【发布时间】:2014-03-18 16:46:21
【问题描述】:

我有以下代码来创建元素的静态列表并通过 Id 检索它们:

Private Shared Property SubStructTypes As IList(Of SubstructureType)

Shared Sub New()
    SubStructTypes = New List(Of SubstructureType) From {
        New SubstructureType With {.Id = "PURLIN", .Description = "Purlin"},
        New SubstructureType With {.Id = "METALDECKING", .Description = "Metal Decking"},
        New SubstructureType With {.Id = "WOODDECKING", .Description = "Wood Decking"}
    }
End Sub

Public Shared Function GetById(ByVal myId As String) As SubstructureType
    If String.IsNullOrWhiteSpace(myId) Then
        Return Nothing
    End If

    Dim straightCompare = SubStructTypes.SingleOrDefault(Function(subStruct) subStruct.Id = myId)
    Dim howIsThisFindingAnything = SubStructTypes.SingleOrDefault(Function(subStruct) subStruct.Id.ToUpper() = myId.ToLower())

    Return SubStructTypes.SingleOrDefault(Function(subStruct) subStruct.Id.ToLower() = myId.ToLower())
End Function

这个类没有什么特别的:

<Serializable>
Public Class SubstructureType
    Public Property Id As String
    Public Property Description As String
End Class

当传入 Id 时,SingleOrDefault 方法将在列表中查找值,而不管字符串大小写如何。这可以在下面的屏幕截图中看到:

问题: 为什么在我的集合上调用 SingleOrDefault 以过滤掉查找列表中元素的 Id 值,即使大小写不同(即“Purlin”与“PURLIN”)。这在我明确更改大小写的howIsThisFindingAnything 变量中很明显。

注意:

  • SingleOrDefault 使用标准 .NET 调用
  • 框架版本:.NET 4

【问题讨论】:

  • 你在使用 linq 到实体吗? stackoverflow.com/questions/3843060/…
  • @Dleh 不,只是静态列表上的内存查询。
  • 也许您应该尝试使用 String.Equals() 而不是 = 符号?我不太熟悉 VB 如何解释 =
  • @DLeh 你说得对,那行得通。默认情况下,VB.NET 不关心区分大小写吗?为了测试这一点,我添加了一个变量 Dim isTrue = "test" = "TEST" 并且表达式为真。

标签: .net vb.net linq


【解决方案1】:

在 VB.Net 中有语句/项目编译选项:Option Compare

对此有两个选项:TextBinary

可能您已将其配置为Text

根据您的环境设置方式,将决定默认设置方式。检查我的设置,我通常在项目设置中将其默认为二进制。

不同的是(来自MSDN here):

二进制:

根据从字符的内部二进制表示派生的排序顺序进行字符串比较。 这种类型的比较非常有用,尤其是当字符串可以包含不被解释为文本的字符时。在这种情况下,您不希望对字母等价的比较产生偏见,例如不区分大小写。

文字:

根据系统区域设置确定的不区分大小写的文本排序顺序进行字符串比较。 如果您的字符串包含所有文本字符,并且您希望在考虑字母等价(例如不区分大小写和密切相关的字母)的情况下比较它们,则这种类型的比较很有用。例如,您可能希望 A 和 a 相等,而 Ä 和 ä 在 B 和 b 之前。

这些选项不仅对明显的相等场景有影响,而且对排序顺序等领域也有影响。

这可以在以下位置设置/默认:

  1. 代码文件的最顶端
  2. Project Properties >> Compile 页面中设置的项目默认值
  3. 在选项 >> 项目和解决方案 >> VB 默认页面中设置的新项目的默认值。

我个人倾向于使用Binary,因为它的行为与其他语言(例如 C#/Javascript 等)最相似,然后在我需要不区分大小写的相等性处显式编码。

【讨论】:

  • 感谢您的真实回答!
  • 我决定将我选择的答案更改为此答案,因为它更直接地回答了我问题的“为什么”部分。
【解决方案2】:

根据评论线程,这个问题的答案是使用 String.Compare 而不是 =

更多comparing strings in vb请查看本帖

【讨论】:

  • 我删除了我的答案,你是第一个。 ;) +1
  • @Crono 非常可敬
  • @CoderDennis 该答案告诉您如何更改环境以解决问题,该答案告诉您如何在给定环境中修复它。
  • @CoderDennis 请对实际上不正确的答案投反对票。这是一种解决方法这一事实可能值得评论,但不是反对。
猜你喜欢
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多