C#List.Sort给出了意想不到的结果

时间:2013-08-27 12:06:13

标签: c# string sorting

我有以下带有或多或少随机字符串的字符串列表:

    List<string> list= new List<string>();
    list.Add( "Apple" );
    list.Add( "Bubble" );
    list.Add( "Dino" );
    list.Add( "Common" );

    list.Sort();

    list.Add( "Aalborg" );

    list.Sort();

    StringBuilder sb = new StringBuilder();

    foreach ( string s in list) {
      sb.Append( s + " -> ");
    }

    MessageBox.Show( sb.ToString() );

我得到了

Apple -> Bubble -> Common -> Dino -> Aalborg ->

而不是

Aalborg -> Apple -> Bubble -> Common -> Dino ->

正如我预期的那样

解决方案:

list.Sort(StringComparer.InvariantCultureIgnoreCase);

由于cultureinfo,Aa被读为Å

3 个答案:

答案 0 :(得分:5)

这很可能是语言环境问题,

尝试

list.Sort(StringComparer.InvariantCultureIgnoreCase);

比较

list.Sort(StringComparer.Create(new CultureInfo("da-dk"), false));

在第一种情况下,“Aa”被视为重复两次的英文字母“a”。在第二个例子中,“Aa”被视为丹麦语“Å”,这是字母表的最后一个字母。因此,由于某种原因,字符串比较必须是丹麦语,并且在此上下文中排序是正确的。

答案 1 :(得分:4)

与文化信息有关尝试:

List<string> list = new List<string>();
list.Add("Apple");
list.Add("Bubble");
list.Add("Dino");
list.Add("Common");
list.Add("Aalborg");

list.Sort(new CultureInfo("da-DK").CompareInfo.Compare);
Console.WriteLine(string.Join(",",list)); //As in question

list.Sort(new CultureInfo("en-US").CompareInfo.Compare);
Console.WriteLine(string.Join(",",list)); //As people expect

答案 2 :(得分:0)

这是CultureInfo问题(或功能)。

每个回答的人都会在代码前加上:

Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo("da");

对于丹麦文化而言,你会得到与问题主题相同的奇怪结果。

在阅读@ feaster对原帖后的评论后,我找到了这个解决方案。

要避免此行为,请使用System.Globalization.CultureInfo.InvariantCulture。