我有以下代码来创建静态元素列表并通过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
Run Code Online (Sandbox Code Playgroud)
这堂课没什么特别之处:
<Serializable>
Public Class SubstructureType
Public Property Id As String
Public Property Description As String
End Class
Run Code Online (Sandbox Code Playgroud)
传递Id时,SingleOrDefault方法将在列表中找到值,而不管字符串大小写.这可以在下面的截图中看到:

问题:为什么在我的集合上调用SingleOrDefault来过滤掉在列表中找到元素的Id值,即使外壳不同(即"Purlin"与"PURLIN").这在我的howIsThisFindingAnything变量中可以清楚地看到,我明确地改变了外壳.
注意:
在VB.Net中有语句/项目编译选项:Option Compare.
有两种选择:Text和Binary.
它可能是你在某处配置的Text.
根据您的环境设置方式,将指定默认情况下如何设置.检查我的设置,我通常在项目设置中默认为二进制.
区别在于(来自MSDN):
二进制:
基于从字符的内部二进制表示派生的排序顺序的字符串比较结果.如果字符串可以包含不被解释为文本的字符,则此类比较非常有用.在这种情况下,您不希望将比较偏向于字母等价,例如不区分大小写.
文本:
字符串比较中的结果基于由系统的语言环境确定的不区分大小写的文本排序顺序.如果您的字符串包含所有文本字符,并且您希望在考虑字母等价(如不区分大小写和密切相关的字母)的情况下比较它们,则此类比较非常有用.例如,您可能希望将A和a视为相等,并且Ä和ä在B和b之前.
这些选项不仅影响明显的平等场景,还影响排序顺序等领域.
这可以在以下位置设置/默认:
我个人倾向于使用Binary它,因为它的行为与其他语言(如C#/ Javascript等)最相似,然后显式编码我需要不区分大小写的相等位置.