.net - 不考虑字符串大小写的 VB.NET LINQ 查询

标签 .net vb.net linq

我有以下代码来创建元素的静态列表并通过 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 中清晰可见我显式更改 shell 的变量。

笔记:
  • SingleOrDefault 正在使用标准的 .NET 调用
  • 框架版本:.NET 4
  • 最佳答案

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

    对此有两个选项:TextBinary .

    这可能是您在 Text 的某个地方配置了这个.

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

    区别在于(来自 MSDN here ):

    二进制:

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

    文字:

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

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

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

  • 代码文件的最顶部
  • 项目默认设置在项目属性>>编译页面
  • 在选项 >> 项目和解决方案 >> VB 默认值页面中设置的新项目的默认值。

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

    关于.net - 不考虑字符串大小写的 VB.NET LINQ 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22485759/

    相关文章:

    c# - 你能多次调用一个任务的 Wait() 吗?

    vb.net - 有什么方法可以暂停 Windows 关闭,以便 forms.closing 方法可以完成吗?

    c# - 如何使用 Entity Framework 和存储库模式获取记录数

    c# - 使用 Linq 将 foreach IEnumerable<string> 分配给 Object.StringId

    c# - 在 C# 类中获取屏幕分辨率(无表单/wpf/aps.net/...)

    .net - 无法实例化实现类型

    c# - 使用 ConfigurationManager 帮助访问应用程序设置

    vb.net - Directory.GetFiles 返回整个路径,我只想要文件名?

    vb.net - Xml 文档 <code> 标签显示 C# for VB.NET 代码

    c# - 无法将类型 System.Collections.Generic.IEnumerable 隐式转换为 System.Collections.Generic.List