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

时间:2012-06-21 12:40:39

标签: c# string cultureinfo

我正在搜索一个策略,我可以将String.CompareTo的默认排序顺序设置为bytewise - ordinal。我需要来执行此操作,而无需在方法调用中指定sortorder。

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

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配置为相同的默认行为,那将是最优雅的解决方案。

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

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

提前致谢!

2 个答案:

答案 0 :(得分:3)

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

这确实可以在VB.NET中运行,可能是你追求这个的原因。它有一个Option Compare语句,允许您选择二进制比较。然而,这不是用CultureInfo实现的,而是由编译器完成的。它识别字符串比较,使用自定义vb.net字符串比较方法替换,该方法知道所选的选项比较。它的名字是Microsoft.VisualBasic.CompilerServices.Operators.CompareString()

您不能将C#编译器哄骗为相同的行为。您必须在转换后的vb.net代码中苦心取代比较表达式。当然是一个可怕的工作,很容易出错。如果转换是由转换器程序完成的,那么你可能最好使用一个好的反编译器,它不会隐藏CompareString()调用。

答案 1 :(得分:1)

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

如果您想要的是始终一致的比较结果,您可以为您在应用中创建的每个线程设置“不变”(cultureInfo,空字符串作为参数)     Thread.CurrentThread.CurrentCulture = new CultureInfo(“”); 如果你想对性能进行序数比较,我真的认为没有什么可以全局完成 - 每次执行字符串比较时都需要明确地传递这个选项。

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