我正在寻找一种策略,可以用它将String.CompareTo的默认sortorder设置为按序号排列。我需要来做到这一点,而不必在调用该方法时指定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配置为相同的默认行为,那么它将是最优雅的解决方案。
当然,可以使用比较说明符重新转换代码。或者,我们可以引入一种扩展方法来执行序号(二进制)比较。等等..。
然而,就我而言,从架构的角度来看,这些解决方案并不那么优雅。这就是为什么我正在寻找一个解决方案,用它我可以在框架上设置这个有序的全球比较。
提前感谢!
发布于 2012-06-27 12:53:21
抱歉,你不能让这件事成功。CompareInfo类确实有一个构造函数。但它是内部的,并以CultureInfo作为参数。实际的实现涉及到CultureInfo的私有成员,这些成员反映了构建在mscorlib中的排序表。它们是不可扩展的。
实际上,这在VB.NET中是有效的,这大概是您追求这一目标的原因。它有一个选项比较语句,允许您选择二进制比较。然而,这不是用CultureInfo实现的,而是由编译器完成的。它识别字符串比较,并将其替换为知道所选选项比较的自定义vb.net字符串比较方法。它的名字是Microsoft.VisualBasic.CompilerServices.Operators.CompareString()
您不能诱使C#编译器执行相同的行为。您必须在转换后的vb.net代码中艰苦地替换比较表达式。当然,这是一份很糟糕的工作,而且很容易出错。如果转换是由一个转换器程序完成的,那么使用一个好的反编译程序可能会更好,它不会隐藏CompareString()调用。
发布于 2012-06-27 13:03:33
似乎没有办法设置默认的比较模式(这里,序号)。
如果您想要的始终是-一致的比较结果,您可以为您在应用程序中创建的每个线程设置“不变量”区域性(以空字符串作为参数) Thread.CurrentThread.CurrentCulture =新的CultureInfo("");如果您想要执行顺序比较以提高性能,我真的认为在全局范围内什么都不能做--您每次执行字符串比较时都需要显式传递此选项。
你能告诉我们你到底需要什么吗?
https://stackoverflow.com/questions/11138387
复制相似问题