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