【发布时间】:2021-03-14 09:43:07
【问题描述】:
我使用string.Compare(strA, strB, true, CultureInfo.CurrentCulture); 并且不理解结果。
CurrentCulture 是“de-DE”。
string.Compare( "o", "ö", true, CultureInfo.CurrentCulture) // result: -1
string.Compare( "d", "f", true, CultureInfo.CurrentCulture) // result: -1
string.Compare( "dx", "fa", true, CultureInfo.CurrentCulture) // result: -1
string.Compare( "ox", "öa", true, CultureInfo.CurrentCulture) // result: 1
string.Compare( "oa", "öx", true, CultureInfo.CurrentCulture) // result: -1
为什么结果取决于第二个字母在最后两行得到不同的结果? 如果 o 是第一个,ö 是下一个,第 4 行不应该也返回 -1 吗? 有人可以解释一下吗?
解释为什么我有这个问题比较一些代码:
class Program
{
public class ComparerB : IComparer<string>
{
public int Compare(string x, string y)
{
return string.CompareOrdinal(x, y);
}
}
public class ComparerA : IComparer<string>
{
public int Compare(string x, string y)
{
return string.Compare(x, y, true, CultureInfo.CurrentCulture);
}
}
static void Main(string[] args)
{
List<string> list = new List<string>();
list.Add("Update");
list.Add("Ö3 Greatest Hits");
list.Add("Dont sleep");
list.Add("Friends");
list.Add("Dart vadder");
list.Add("Family");
list.Add("Oxfort");
list.Add("Ödipus");
list.Add("Oasis");
list.Add("Österreich");
list.Add("Panda");
list.Sort(new ComparerA());
foreach (var item in list)
{
Console.WriteLine(item);
}
Console.WriteLine();
list.Sort(new ComparerB());
foreach (var item in list)
{
Console.WriteLine(item);
}
Console.ReadLine();
}
}
使用 ComparerA 的结果是(混合 Ö 和 O):
飞镖飞镖
不要睡觉
家庭
朋友
Ö3 精选
绿洲
奥狄普斯
奥地利
牛津大学
熊猫
更新
使用 ComparerB 的结果是(Ö 在列表末尾):
飞镖飞镖
不要睡觉
家庭
朋友
绿洲
牛津大学
熊猫
更新
Ö3 精选
奥狄普斯
奥斯特雷赫
但我需要的是这个(O 之后的Ö):
飞镖飞镖
不要睡觉
家庭
朋友
绿洲
牛津大学
Ö3 精选
奥狄普斯
奥地利
熊猫
更新
【问题讨论】:
-
你期望得到什么?因为我们大多数人不懂德语
-
这是预期的结果:"大于零:strA 在排序顺序中跟随 strB。"。请参阅 [String.Compare(String, String, Boolean, CultureInfo) ](docs.microsoft.com/en-us/dotnet/api/…)。您希望比较平等吗?
-
如果我使用它对列表进行排序,我会得到 O 和 Ö 的混合。如果我使用 CompareOrdianl,我得到的结果不会混合,但特殊字符位于列表末尾。我想得到一个排序如下的列表:首先是 O,然后是 Ö。
-
如果您愿意,您可以定义您自己的
CultureInfo,其中Ö排在O之前。但是在德语中,显然是由微软和大概其他人实施的,它们的排序方式不同。您可以进行反向排序,但显然这也会对其他字符进行不同的排序。 -
德语字母表在 Z 之后排序了 ÄÖÜ。因此,
ComparerB示例似乎“正确”工作。见:en.wikipedia.org/wiki/German_orthography “[元音变音] 被官方认为是字母表中不同的字母。”所以它们不仅仅是AOU的“特殊种类”。 - 不过,对你没有帮助。也许有一种方法可以创建你自己的IComparer<string>,但这可能很快就会变成你不想把手伸进去的蜂巢。