在全球范围内设置String.Compare/ CompareInfo.Compare到有序(Glo

2019-06-25 16:05发布

我在寻找与我可以设置String.CompareTo的默认排序顺序来按字节的策略 - 序。 我需要做到这一点,而不必调用该方法来指定排序顺序。

我已经尝试了多种策略没有令人满意的结果。 我就这样的:

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相同的默认行为。

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

但是,就我而言,从体系结构的角度来看,这些解决方案都是那么优雅。 这就是为什么我在寻找与我可以在框架全局设置这个序号比较的解决方案的原因。

提前致谢!

Answer 1:

对不起,你不能使这项工作。 该CompareInfo类确实有一个构造函数。 但它是内部和需要的CultureInfo作为一个参数。 实际的实施涉及的CultureInfo的私有成员,体现建成的mscorlib排序表。 他们是不可扩展的。

但这实际上是在VB.NET的工作,想必原因,你都追求这一点。 它有一个选项比较语句,让你选择二进制比较。 但是,这是不是与CultureInfo的实现,它是由编译器完成。 其识别字符串比较,并用自定义vb.net字符串比较方法是了解所选择的选项进行比较的替换它。 它的名字是Microsoft.VisualBasic.CompilerServices.Operators.CompareString()

你不能哄C#编译器到相同的行为。 你不得不煞费苦心地在转换vb.net代码替换比较表达式。 当然了可怕的工作,很容易出错。 如果转换是由转换器程序来完成,那么你可能是一个很好的反编译器更好,也不会隐藏CompareString()调用。



Answer 2:

似乎有设置默认的比较模式没有办法(在这里,以序数)。

如果你想要的是始终一致的比较结果,您可以设置,为您在您的应用程序创建的每个线程的文化“不变”(的CultureInfo空字符串作为参数)Thread.CurrentThread.CurrentCulture =新的CultureInfo(“”) ; 如果要执行性能序号比较,我真的觉得没有什么可以做全球的 - 你需要在每次执行字符串比较明确地时间通过这个选项。

你能告诉我们您需要的究竟是什么?



文章来源: Globally set String.Compare/ CompareInfo.Compare to Ordinal