VB.NET LINQ查询忽略字符串大小写

7

我有以下代码用于创建静态元素列表,并通过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方法会在列表中找到该值,而不管字符串大小写。如下面的截图所示: enter image description here 问题: 为什么调用集合上的SingleOrDefault方法来过滤Id值时,即使大小写不同(例如“Purlin”与“PURLIN”),也能找到列表中的元素?这在我的howIsThisFindingAnything变量中明显可见,我明确更改了大小写。
注意: - SingleOrDefault使用标准的.NET调用。 - 框架版本:.NET 4

你正在使用实体框架的linq吗?https://dev59.com/gG865IYBdhLWcg3wYNjj - DLeh
@Dleh 不是,只是针对静态列表的内存查询。 - contactmatt
也许你应该尝试使用String.Equals()而不是=符号?我对VB如何解释=符号不太熟悉。 - DLeh
1
请把以下跟编程有关的内容从英语翻译成中文:或者可以参考:https://dev59.com/s3NA5IYBdhLWcg3wmfAa - DLeh
@contactmatt 当我运行它时,该表达式是错误的。我认为我除了 VB.NET 的默认设置之外没有其他东西。 - CoderDennis
显示剩余2条评论
2个回答

7
在VB.Net中,有一个语句/项目编译选项:Option Compare
这有两个选项:TextBinary
可能你在某个地方将其配置为Text。根据您的环境设置如何设置默认值。检查我的设置时,我通常将其默认设置为二进制文件。
区别是(来自MSDN): 二进制: 导致基于从字符的内部二进制表示派生的排序顺序的字符串比较。如果字符串可以包含不被解释为文本的字符,则此类比较特别有用。在这种情况下,您不希望使用字母等效性偏差比较,例如大小写不敏感性。 文本: 导致基于系统语言环境确定的不区分大小写的文本排序顺序的字符串比较。如果您的字符串包含所有文本字符,并且您想要考虑诸如大小写不敏感性和密切相关字母之间的字母等效性进行比较,则此类比较特别有用。例如,您可能希望将A和a视为相等,并且Ä和ä排在B和b之前。
这些选项不仅影响明显的相等性场景,还影响排序顺序等领域。
这可以在以下位置设置/默认设置:
  1. 代码文件的顶部
  2. 在项目属性 >> 编译页面中设置为项目默认值
  3. 在选项 >> 项目和解决方案 >> VB Defaults 页面中设置新项目的默认值。
个人而言,我倾向于使用Binary,因为它的行为最类似于其他语言,例如C# / Javascript等,然后明确编写需要不区分大小写的相等性的代码。

2
感谢您提供真实的答案! - CoderDennis
1
我决定将我的选定答案更改为这个答案,因为它更直接地回答了我问题中的“为什么”部分。 - contactmatt

0
根据评论线程,解决方法是使用String.Compare而不是=。
请参阅此线程以了解更多在VB中比较字符串

2
我删掉了我的回答,你先回答了。;) +1 - Crono
@Crono 非常值得尊敬。 - contactmatt
@CoderDennis,那个答案告诉你如何更改你的环境来解决问题,而这个答案告诉你如何在给定的环境中解决它。 - DLeh
@CoderDennis请将负评留给那些实际上是错误的答案。它是一个解决方法的事实可能值得一条评论,但不应该是一个负评的理由。 - Crono

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接