我使用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 ist优先,是下一个,那么第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最大点击量
迪帕斯
斯特雷希
熊猫
更新
发布于 2021-03-14 14:50:11
在您的比较器A中,您有以下代码
return string.Compare(x, y, true, CultureInfo.CurrentCulture);这意味着您使用的是CurrentCulture,我相信它是德语的,所以我在互联网上注意到的德语字母表按以下顺序排列
A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,,U,
因此,排序将是相应的,,所以您目前得到的是正确的,我相信,但是如果您仍然需要按您的意愿去做,并且,您可以使用另一个 CultureInfo,其中O, Ö序列就像土耳其"tr-TR",那么代码应该是:
return string.Compare(x, y, true, new CultureInfo("tr-TR"));它给出了以下结果:
Dart vadder
Dont sleep
Family
Friends
Oasis
Oxfort
Ö3 Greatest Hits
Ödipus
Österreich
Panda
Update另一个选项是开发考虑任何字符序列的自定义排序算法和函数。
发布于 2021-03-14 10:04:47
我认为在德语字母排序中,特殊字符ö在内部由oe表示。
所以string.Compare( "o", "ö", true, System.Globalization.CultureInfo.CurrentCulture);等同于string.Compare( "o", "oe", true, System.Globalization.CultureInfo.CurrentCulture);。
string.Compare( "ox", "öa", true, System.Globalization.CultureInfo.CurrentCulture);相当于string.Compare( "ox", "oea", true, System.Globalization.CultureInfo.CurrentCulture);。那么结果1是有意义的。
https://stackoverflow.com/questions/66623010
复制相似问题