有没有一种方法可以在不完全自定义相等/比较的情况下将F#记录类中字符串字段的比较替换为不区分大小写?使用不区分大小写比较从集合中减去记录是我找到的最接近答案的方法。
如果你想以一种清晰的方式实现它,我建议引入一个不区分大小写字符串的包装类型。这样,你可以在类型中反映不区分大小写比较的概念,而不必更改记录上的默认结构比较。
[<CustomEquality; CustomComparison>]
type CIString =
| CI of string
override x.Equals y = ...
override x.GetHashCode() = ...
interface System.IComparable with
member x.CompareTo y = ...
我没有包含方法的实现 - 没有什么花哨的东西,只需在访问嵌套字符串时使用ToUpperInvariant
即可。
然后你可以像这样修改你的记录:
type OldRecord = { field : string }
type NewRecord = { field : CIString }
对新类型的比较应该显示{ field = "TEST" } = { field = "test" }
。
我提出的另一种解决方案(基于反射)对于简单情况很容易实现,但是它是不可靠的。如果您甚至可以确定这里的“合理方式”是什么,使其在所有可能的情况下以明智的方式工作是一个非平凡的练习。
Microsoft.FSharp.Reflection.FSharpValue.MakeRecord
来复制整个记录,而不仅仅是字符串,那么就有一种低效的方法可以使用大小写不敏感的字符串来完成结构比较。否则,请尝试使用StringComparer.InvariantCultureIgnoreCase.Compare(x : string, y : string)
。 - kaefer