我有以下代码来创建元素的静态列表并通过 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
中清晰可见我显式更改 shell 的变量。笔记:
最佳答案
在 VB.Net 中有语句/项目编译选项:Option Compare
.
对此有两个选项:Text
和 Binary
.
这可能是您在 Text
的某个地方配置了这个.
根据您的环境的设置方式将决定默认情况下的设置方式。检查我的设置,我通常在项目设置中默认为二进制。
区别在于(来自 MSDN here ):
二进制:
根据从字符的内部二进制表示派生的排序顺序进行字符串比较。
这种类型的比较非常有用,特别是如果字符串可以包含不会被解释为文本的字符。在这种情况下,您不希望使用字母等价的比较偏向,例如不区分大小写。
文字:
根据系统区域设置确定的不区分大小写的文本排序顺序进行字符串比较。
如果您的字符串包含所有文本字符,并且您希望在考虑字母等效性(例如不区分大小写和密切相关的字母)的情况下比较它们,则这种类型的比较非常有用。例如,您可能希望 A 和 a 相等,并且 Ä 和 ä 位于 B 和 b 之前。
这些选项不仅对明显的相等场景有影响,而且对排序等领域也有影响。
这可以在以下位置设置/默认:
我个人倾向于使用
Binary
因为它的行为与其他语言(如 C#/Javascript 等)最相似,然后在我需要不区分大小写的相等性的地方显式编码。
关于.net - 不考虑字符串大小写的 VB.NET LINQ 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22485759/