5

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

我尝试了几种策略,但都没有令人满意的结果。我做到了这一点:

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

        CompareInfo compareInfo = new CustomCompareInfo();
        crib.Register();

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

The type 'System.Globalization.CompareInfo' has no constructors defined

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

对此有任何想法吗?

编辑:我的问题的背景:

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

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

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

提前致谢!

4

2 回答 2

4

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

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

您不能哄骗 C# 编译器进入相同的行为。您必须煞费苦心地替换转换后的 vb.net 代码中的比较表达式。当然,这是一项糟糕的工作,而且很容易出错。如果转换是由转换器程序完成的,那么使用好的反编译器可能会更好,它不会隐藏 CompareString() 调用。

于 2012-06-27T12:53:21.033 回答
1

似乎无法设置默认比较模式(此处为序数)。

如果您想要的是始终一致的比较结果,您可以为您在应用程序中创建的每个线程设置文化为“不变”(cultureInfo 以空字符串作为参数) Thread.CurrentThread.CurrentCulture = new CultureInfo("") ; 如果您想为性能执行序数比较,我真的认为无法全局执行任何操作 - 每次执行字符串比较时都需要显式传递此选项。

你能告诉我们你到底需要什么吗?

于 2012-06-27T13:03:33.867 回答