微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C# 比较字符串与变音奇怪的结果

如何解决C# 比较字符串与变音奇怪的结果

我使用 string.Compare(strA,strB,true,CultureInfo.CurrentCulture); 并且不理解结果。 CurrentCulture 是“de-DE”。

string.Compare( "o","ö",CultureInfo.CurrentCulture) // result: -1 
string.Compare( "d","f",CultureInfo.CurrentCulture) // result: -1 
string.Compare( "dx","fa",CultureInfo.CurrentCulture) // result: -1 
string.Compare( "ox","öa",CultureInfo.CurrentCulture) // result: 1 
string.Compare( "oa","öx",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,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):

Dart vadder
别睡觉
家庭
朋友
Ö3 最热门单曲
绿洲
奥迪普斯
奥地利
牛津
熊猫
更新

使用 ComparerB 结果是(列表末尾的Ö):

Dart vadder
别睡觉
家庭
朋友
绿洲
牛津
熊猫
更新
Ö3 最热门单曲
奥迪普斯
奥地利

但我需要的是这个(O 之后的Ö):

Dart vadder
别睡觉
家庭
朋友
绿洲
牛津
Ö3 最热门单曲
奥迪普斯
奥地利
熊猫
更新

解决方法

我认为在德语字母排序中,特殊字符 ö 在内部由 oe 表示。

所以string.Compare( "o","ö",true,System.Globalization.CultureInfo.CurrentCulture); 相当于 string.Compare( "o","oe",System.Globalization.CultureInfo.CurrentCulture);

string.Compare( "ox","öa",System.Globalization.CultureInfo.CurrentCulture); 等价于 string.Compare( "ox","oea",System.Globalization.CultureInfo.CurrentCulture);。那么结果 1 是有道理的。

,

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

return string.Compare(x,y,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、Ä、Ö、Ü、ß

因此,排序将相应地进行,所以您目前得到的是正确的我相信但如果您仍然需要按照自己的意愿行事并且您愿意使用另一个 strong> CultureInfo 其中 O,Ö 的序列就像土耳其语 "tr-TR" 一样紧随其后,那么代码应该是这样的:

return string.Compare(x,new CultureInfo("tr-TR"));

这给你以下结果:

Dart vadder
Dont sleep
Family
Friends
Oasis
Oxfort
Ö3 Greatest Hits
Ödipus
Österreich
Panda
Update

另一种选择是开发您的自定义排序算法和函数,以考虑您喜欢的任何字符序列。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。