gpt4 book ai didi

c# - 全局设置 String.Compare/CompareInfo.Compare 为 Ordinal

转载 作者:太空狗 更新时间:2023-10-30 01:23:29 25 4
gpt4 key购买 nike

我正在寻找一种策略,通过它我可以将 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 配置为相同的默认行为,这将是最优雅的解决方案。

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

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

提前致谢!

最佳答案

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

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

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

关于c# - 全局设置 String.Compare/CompareInfo.Compare 为 Ordinal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11138387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com