首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#比较字符串和umlaut奇怪的结果

C#比较字符串和umlaut奇怪的结果
EN

Stack Overflow用户
提问于 2021-03-14 09:43:07
回答 2查看 298关注 0票数 3

我使用string.Compare(strA, strB, true, CultureInfo.CurrentCulture);,不要忘记结果。CurrentCulture是"de-DE“。

代码语言:javascript
复制
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?有人能解释一下吗?

要解释为什么我在这方面有问题,请比较以下代码:

代码语言:javascript
复制
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最大点击量

迪帕斯

斯特雷希

熊猫

更新

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-14 14:50:11

在您的比较器A中,您有以下代码

代码语言:javascript
复制
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",那么代码应该是:

代码语言:javascript
复制
return string.Compare(x, y, true, new CultureInfo("tr-TR"));

它给出了以下结果:

代码语言:javascript
复制
Dart vadder
Dont sleep
Family
Friends
Oasis
Oxfort
Ö3 Greatest Hits
Ödipus
Österreich
Panda
Update

另一个选项是开发考虑任何字符序列的自定义排序算法和函数

票数 3
EN

Stack Overflow用户

发布于 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是有意义的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66623010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档