C#将字符串与umlaut奇怪的结果进行比较
我使用C#将字符串与umlaut奇怪的结果进行比较,c#,string,compare,C#,String,Compare,我使用string.Compare(strA、strB、true、CultureInfo.CurrentCulture)并不要对结果进行反驳。 当前的文化是“德德” 为什么结果取决于第二个字母,以便在最后两行得到不同的结果? 如果o是第一个,而ö是下一个,那么第4行是否也应该返回-1? 有人能解释一下吗 要解释我在这方面遇到问题的原因,请比较一些代码: class Program { public class ComparerB : IComparer<string
string.Compare(strA、strB、true、CultureInfo.CurrentCulture)
并不要对结果进行反驳。
当前的文化是“德德”
为什么结果取决于第二个字母,以便在最后两行得到不同的结果?
如果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();
}
}
类程序
{
公共类比较器B:IComparer
{
公共整数比较(字符串x、字符串y)
{
返回字符串.CompareOrdinal(x,y);
}
}
公共类比较:IComparer
{
公共整数比较(字符串x、字符串y)
{
返回string.Compare(x,y,true,CultureInfo.CurrentCulture);
}
}
静态void Main(字符串[]参数)
{
列表=新列表();
列表。添加(“更新”);
添加(“Ö3大热门歌曲”);
添加(“不要睡觉”);
列表。添加(“朋友”);
列表。添加(“Dart vadder”);
列表。添加(“家庭”);
列表。添加(“Oxfort”);
列表。添加(“Ödipus”);
列表。添加(“绿洲”);
列表。添加(“Österreich”);
列表。添加(“熊猫”);
list.Sort(new ComparerA());
foreach(列表中的变量项)
{
控制台写入线(项目);
}
Console.WriteLine();
Sort(newcomparerb());
foreach(列表中的变量项)
{
控制台写入线(项目);
}
Console.ReadLine();
}
}
使用ComparerA,结果是(混合Ö和O):
达特瓦德不要睡觉
家庭
朋友们
Ö3大热门歌曲
绿洲
Ödipus
Österreich
奥克斯福特
熊猫
更新 使用比较器b,结果是(列表末尾的Ö): 达特瓦德
不要睡觉
家庭
朋友们
绿洲
奥克斯福特
熊猫
更新
Ö3大热门歌曲
Ödipus
Österreich 但我需要的是这个(O之后的Ö): 达特瓦德
不要睡觉
家庭
朋友们
绿洲
奥克斯福特
Ö3大热门歌曲
Ödipus
Österreich
熊猫
更新我认为在德语字母表排序中,特殊字符
ö
在内部由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是有意义的。在比较器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、Ä、Ü、ß
因此,排序将相应地进行,因此您当前得到的是正确的,我相信,但是如果您仍然需要按照自己的意愿做,您可以使用另一个文化信息
,其中
的顺序紧跟在一起,就像土耳其语的
“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
<强>另一个选项是开发你的<强>自定义排序算法和函数< /强>,考虑你喜欢的任何字符序列。
你期望得到什么?由于我们大多数人不了解Germant,这是预期的结果:“大于零:strA按照排序顺序跟随strB。”。请参见[String.Compare(String,String,Boolean,CultureInfo)]()。你希望比较相等吗?如果我用这个来排序一个列表,我会得到O和Ö的混合。如果我使用compareOrdinal,我得到的结果不是混合的,而是特殊字符在列表的末尾。我想得到一个排序如下的列表:首先是带O的all,然后是带Ö的all。如果你想,那么你可以定义你自己的CultureInfo
其中Ö
在O
之前排序。但在德语中,显然是由微软和其他公司实施的,它们的排序不同。您可以进行反向排序,但显然这也会对其他字符进行不同的排序。德语字母表在Z之后进行了ÄÖÜ排序。因此,ComparerB
示例似乎“正确”工作。参见:“[Umlauts]被官方认为是字母表中不同的字母。”因此它们不仅仅是AOU的“特殊种类”但这对你没什么帮助。也许有一种方法可以创建您自己的IComparer
,但这很快就会成为一个您不想插手的蜂巢。好的,谢谢。但问题是对列表进行排序。将结果与第一个字符中的o和ö进行比较。CompareOrdinal和特殊字符位于列表的末尾。我需要的是一个列表,首先是所有的o,然后是所有的ö…@Udo。你能用输入数据示例和预期结果更新你的问题吗?这样就可以更好地理解你的意思了@阿莱霍萨尼。我加了一个例子,谢谢。用“tr tr”我得到了我想要的。我已经试过“de-de_phoneb”,但没有任何改变。为此感到高兴:)
Dart vadder
Dont sleep
Family
Friends
Oasis
Oxfort
Ö3 Greatest Hits
Ödipus
Österreich
Panda
Update