【问题标题】:string partial comparison [duplicate]字符串部分比较[重复]
【发布时间】:2012-11-08 13:54:51
【问题描述】:

可能重复:
Why does string.Compare seem to handle accented characters inconsistently?

我有以下代码

var s1 = "ABzzzzz2";
var s2 = "äbzzzzz1";

var cmp = StringComparison.InvariantCultureIgnoreCase;

Console.WriteLine(string.Compare(s1, 0, s2, 0, 7, cmp)); //prints -1
Console.WriteLine(string.Compare(s1, 0, s2, 0, 8, cmp)); //prints 1

为什么第一个字符串的一部分小于第二个字符串的一部分,而整个第一个字符串大于整个第二个字符串?
我已经在 x64、.net 2.0、3.5、4.0 上测试过了

【问题讨论】:

  • 在我看来,最后的数字优先于定义顺序。
  • 您可以简化您的样本:var s1 = "a2"; var s2 = "ä1"; 顺便说一句,元音变音很重要。
  • 我想你可以在这里找到答案:stackoverflow.com/q/1371813/284240
  • @TimSchmelter 很好的发现!那里接受的答案中的关键句:通常忽略重音差异,如果基本字母有任何差异
  • @Tim Schmelter:你能写一个答案让我接受吗?

标签: c# .net string comparison


【解决方案1】:

我的理论是算法首先对字符串进行规范化,然后进行比较。根据这个“äbzzzzz1”归一化为“abzzzzz1”。标准化形式的第一次比较结果相等,但返回 0 将是不正确的,因为实际字符串不相等。所以它恢复为序数比较和结果-1。

第二种情况,归一化后,显然“abzzzzz2”大于“abzzzzz1”,所以结果为1。

这种方法也解释了this question中提到的案例 有关规范化的详细信息,请查看MSDN page

【讨论】:

    猜你喜欢
    • 2023-02-14
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 2013-04-15
    • 2018-07-09
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多