首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >全局集String.Compare/ CompareInfo.Compare为序号

全局集String.Compare/ CompareInfo.Compare为序号
EN

Stack Overflow用户
提问于 2012-06-21 12:40:38
回答 2查看 1.8K关注 0票数 5

我正在寻找一种策略,可以用它将String.CompareTo的默认sortorder设置为按序号排列。我需要来做到这一点,而不必在调用该方法时指定sortorder。

我尝试了几种策略,但没有取得令人满意的结果。我就这么说了:

代码语言:javascript
复制
CultureAndRegionInfoBuilder crib = 
            new CultureAndRegionInfoBuilder("foo", CultureAndRegionModifiers.Neutral);

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

在这个CustomCompareInfo中,我试图覆盖默认的CompareInfo类,但不幸的是,它没有编译:

代码语言:javascript
复制
The type 'System.Globalization.CompareInfo' has no constructors defined

我被困在这里了。我觉得CompareInfo的自定义实现可以解决我的问题。

对此有什么想法吗?

编辑:我问题的上下文:

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

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

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

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-27 12:53:21

抱歉,你不能让这件事成功。CompareInfo类确实有一个构造函数。但它是内部的,并以CultureInfo作为参数。实际的实现涉及到CultureInfo的私有成员,这些成员反映了构建在mscorlib中的排序表。它们是不可扩展的。

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

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

票数 4
EN

Stack Overflow用户

发布于 2012-06-27 13:03:33

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

如果您想要的始终是-一致的比较结果,您可以为您在应用程序中创建的每个线程设置“不变量”区域性(以空字符串作为参数) Thread.CurrentThread.CurrentCulture =新的CultureInfo("");如果您想要执行顺序比较以提高性能,我真的认为在全局范围内什么都不能做--您每次执行字符串比较时都需要显式传递此选项。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11138387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档