全局设置 String.Compare/CompareInfo.Compare 为 Ordinal

Nic*_*ter 5 c# string cultureinfo

我正在寻找一种可以将 String.CompareTo 的默认排序顺序设置为按字节顺序排列的策略。我要这样做,而不必在方法调用中指定排序顺序。

我尝试了几种策略,但没有令人满意的结果。我得到了这个:

CultureAndRegionInfoBuilder crib = 
            new CultureAndRegionInfoBuilder("foo", CultureAndRegionModifiers.Neutral);

        CompareInfo compareInfo = new CustomCompareInfo();
        crib.Register();
Run Code Online (Sandbox Code Playgroud)

在这个 CustomCompareInfo 中,我尝试覆盖默认的 CompareInfo 类,但不幸的是这不会编译:

The type 'System.Globalization.CompareInfo' has no constructors defined
Run Code Online (Sandbox Code Playgroud)

我被困在这里。感觉 CompareInfo 的自定义实现是我问题的解决方案。

对此有任何想法吗?

编辑:我的问题的上下文:

我正在从事的这个项目非常不寻常 - 一个巨大的代码库已从其他编程语言转换为 .NET。在这种编程语言中,字符串比较默认为序数,与 .NET 的这种差异导致转换后的代码库中出现错误,所以我认为如果我们能够将 .NET 配置为相同的默认行为,这将是最优雅的解决方案。

当然,可以使用比较说明符重新转换代码。或者,我们可以引入一个扩展方法来执行序数(二进制)比较。等等..

然而,就我而言,从架构的角度来看,这些解决方案不太优雅。这就是为什么我正在寻找一种解决方案的原因,我可以使用该解决方案在框架上全局设置此序数比较。

提前致谢!

Han*_*ant 4

抱歉,你无法完成这项工作。CompareInfo 类确实有一个构造函数。但它是内部的,并以 CultureInfo 作为参数。实际的实现涉及 CultureInfo 的私有成员,这些成员反映了 mscorlib 中内置的排序表。它们不可扩展。

这实际上在 VB.NET 中有效,大概就是您追求这个的原因。它有一个 Option Compare 语句,可让您选择二进制比较。然而,这不是用 CultureInfo 实现的,而是由编译器完成的。它可以识别字符串比较,并将其替换为自定义 vb.net 字符串比较方法,该方法知道所选的选项比较。它的名称是 Microsoft.VisualBasic.CompilerServices.Operators.CompareString()

您无法诱使 C# 编译器做出相同的行为。您必须费力地替换转换后的 vb.net 代码中的比较表达式。当然,这是一项可怕的工作,而且很容易出错。如果转换是由转换器程序完成的,那么您最好使用一个好的反编译器,它不会隐藏 CompareString() 调用。

  • 好吧,在这种情况下,将其设为全局比较选项是一个特别糟糕的主意,您将破坏转换后添加到项目中的任何代码。只需为客户提供在普通字符串比较和自定义字符串比较之间进行选择的选项即可。 (2认同)