在 .NET 中,某些字符串并非如此:
static void CompareBug()
{
string x = "\u002D\u30A2"; // or just "-ア" if charset allows
string y = "\u3042"; // or just "あ" if charset allows
Console.WriteLine(x.CompareTo(y)); // positive one
Console.WriteLine(y.CompareTo(x)); // positive one
Console.WriteLine(StringComparer.InvariantCulture.Compare(x, y)); // positive one
Console.WriteLine(StringComparer.InvariantCulture.Compare(y, x)); // positive one
var ja = StringComparer.Create(new CultureInfo("ja-JP", false), false);
Console.WriteLine(ja.Compare(x, y)); // positive one
Console.WriteLine(ja.Compare(y, x)); // positive one
}
您会看到x
严格大于y
,并且y
严格大于x
。
因为x.CompareTo(x)
等等都给零(0
),很明显这不是一个命令。毫不奇怪,当我在Sort
数组或列表中包含x
和之类的字符串时,我会得到不可预知的结果y
。虽然我还没有对此进行测试,但如果字符串和用于键的字符串一样,我肯定SortedDictionary<string, WhatEver>
会在保持排序顺序和/或定位项目时遇到问题。x
y
这个错误是众所周知的吗?哪些版本的框架受到影响(我正在尝试使用 .NET 4.0)?
编辑:
这是一个符号为负的示例:
x = "\u4E00\u30A0"; // equiv: "一゠"
y = "\u4E00\u002D\u0041"; // equiv: "一-A"