记录类型的字符串字段不区分大小写比较

3

3
不太可能。你可以通过编写基于反射的代码来节省一些打字时间,但同时也会失去一些类型安全性。 - scrwtp
2
或者将您的字符串包装在一个自定义类型中,该类型将以您想要的方式处理比较,但在这种情况下,您需要更改记录类型的模式。 - scrwtp
1个回答

8

如果你想以一种清晰的方式实现它,我建议引入一个不区分大小写字符串的包装类型。这样,你可以在类型中反映不区分大小写比较的概念,而不必更改记录上的默认结构比较。

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

我提出的另一种解决方案(基于反射)对于简单情况很容易实现,但是它是不可靠的。如果您甚至可以确定这里的“合理方式”是什么,使其在所有可能的情况下以明智的方式工作是一个非平凡的练习。


这基本上就是我所采用的。我还采取了额外的步骤,实现了op_Implicit,以便C#消费者可以使用字符串。我担心序列化问题,但我会在需要时解决这个问题。 - Damian
如果你想通过Microsoft.FSharp.Reflection.FSharpValue.MakeRecord来复制整个记录,而不仅仅是字符串,那么就有一种低效的方法可以使用大小写不敏感的字符串来完成结构比较。否则,请尝试使用StringComparer.InvariantCultureIgnoreCase.Compare(x : string, y : string) - kaefer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接