对Record类型的字符串字段进行不区分大小写的比较

Dam*_*ian 1 f#

有没有办法将F#记录类中的字符串字段的比较替换为不区分大小写,而不必采用完全自定义的相等/比较控制?

使用不区分大小写的比较从集合中减去记录是我在答案中找到的最接近的.

scr*_*wtp 6

如果你想以干净的方式做,我建议为不区分大小写的字符串引入一个包装器类型.这样,您可以在类型中反映不区分大小写的比较概念,而不必更改记录上的默认结构比较.

[<CustomEquality; CustomComparison>]
type CIString = 
    | CI of string
    override x.Equals y = ...
    override x.GetHashCode() = ...
    interface System.IComparable with
        member x.CompareTo y = ...
Run Code Online (Sandbox Code Playgroud)

我省略了方法的实现 - 那里没有任何花哨的东西,只要ToUpperInvariant在访问它时就使用嵌套字符串.

然后你可以像这样修改你的记录:

type OldRecord = { field : string }
type NewRecord = { field : CIString }
Run Code Online (Sandbox Code Playgroud)

并且对新类型的比较应该表明{ field = "TEST" } = { field = "test" }.

我建议的另一个解决方案(基于反射)对于一个简单的案例很容易实现,但它很狡猾.如果你甚至可以确定"合理的方式"在这里意味着什么,那么让它以一种明智的方式对所有可能的情况起作用是一项非常重要的工作.