对记录类型

时间:2015-08-10 18:45:06

标签: f#

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

Subtracting Records from a Set using case-insensitive comparison是我找到的最接近的答案。

1 个答案:

答案 0 :(得分:5)

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

[<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" }

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