Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 全局设置String.Compare/CompareInfo.Compare to Ordinal_C#_String_Cultureinfo - Fatal编程技术网

C# 全局设置String.Compare/CompareInfo.Compare to Ordinal

C# 全局设置String.Compare/CompareInfo.Compare to Ordinal,c#,string,cultureinfo,C#,String,Cultureinfo,我正在搜索一种策略,可以使用该策略将String.CompareTo的默认排序规则设置为bytewise-ordinal。我需要这样做,而不必在方法调用中指定sortorder 我尝试了几种策略,但没有取得令人满意的结果。我做到了这一点: CultureAndRegionInfoBuilder crib = new CultureAndRegionInfoBuilder("foo", CultureAndRegionModifiers.Neutral);

我正在搜索一种策略,可以使用该策略将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。在这种编程语言中,字符串比较默认为ordinal,而与.NET的这种差异会导致转换后的代码库出现错误,因此我认为如果我们能够将.NET配置为相同的默认行为,这将是最优雅的解决方案

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

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


提前谢谢

对不起,你不能让它工作。CompareInfo类没有构造函数。但它是内部的,并以CultureInfo作为参数。实际实现涉及CultureInfo的私有成员,这些成员反映了mscorlib中内置的排序表。它们是不可扩展的

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


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

这里似乎没有办法将默认比较模式设置为顺序

如果您想要的是始终一致的比较结果,那么可以将应用程序中创建的每个线程的区域性设置为“不变”cultureInfo,并将空字符串作为参数 Thread.CurrentThread.CurrentCulture=新文化信息; 如果您想执行顺序比较以提高性能,我真的认为不能在全局范围内执行任何操作—每次执行字符串比较时都需要显式地传递此选项


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

嗯,为什么?该框架为您提供了一种方法,即定义如何进行比较的几种方法,以及访问有关区域设置的数据(包括其排序规则)的方法。为什么你需要使用后者来完成前者的工作?这并不是问题的答案,但你可以定义一个扩展方法MyCompareTo,它可以满足你的需要,并且可以在源代码中大量搜索和替换它,或者2使用诸如Cecil之类的工具对程序集进行后期处理,并根据需要替换调用。我会解释。我正在从事的这个项目很不寻常——一个巨大的代码库已经从其他编程语言转换成了.NET。在这种编程语言中,字符串比较默认为序号。这种差异会导致.NET中的软件出现错误,因此我认为如果我们能够将.NET配置为相同的默认行为,这将是最优雅的解决方案。当然,可以使用比较说明符重新转换代码。或者,我们可以引入一种扩展方法来执行顺序二进制比较。等等……就我而言,从建筑的角度来看,这些解决方案不那么优雅。谢谢你,汉斯。有关上下文,请参见我的评论。我想绝对肯定。我应该在评论中看到什么?看来我在语言转换上猜对了。不要在你的问题中隐藏这样的细节,它会阻止你得到好的答案。你不是第一个遇到这个问题的人。请与语言转换器供应商联系,我确信有可用的选项。对他们来说,这是一个小时的工作,对你来说,这是数周的追踪bug。汉斯,你绝对是对的,除了我们是语言转换器供应商;-正如您可能已经猜到的,通过调试,我们能够跟踪错误的翻译并修复ou
r转换语法。这是我们发现的问题之一。我已经编辑了我的问题。在这种情况下,将其作为全局比较选项是一个特别糟糕的主意,您将破坏转换后添加到项目中的任何代码。只需给客户一个选项,让他们在普通字符串比较和自定义字符串比较之间进行选择。你是对的。如果我们对.NET进行黑客攻击以模仿转换后的语言的行为,这种黑客攻击将使向项目中添加新代码的.NET开发人员感到困惑。已做出决定-我们将向对CompareTo的所有调用添加CompareInfo.Ordinal。这不是一个优雅的解决方案,但至少很清楚发生了什么。谢谢你的帮助,汉斯,赏金是你的。谢谢,更多内容请看我的评论。