2013-08-27 28 views
0

我有以下或多或少随机字符串的字符串列表:C#List.Sort给出了意想不到的效果

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

+2

为什么不'Aalborg - > Apple - > Bubble - > Common - > Dino'? – I4V

+0

你怎么弄到的?我的意思是你做一个foreach并写入控制台? –

+0

请提供SSCCE –

回答

5

这很可能是一个区域问题,

尝试

list.Sort(StringComparer.InvariantCultureIgnoreCase); 

比较

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

在第一种情况下,“AA “被重复处理为英文字母”a“两次。在第二个例子中,“Aa”被视为丹麦语“Å”,它是字母的最后一个字母。所以出于某种原因,你的字符串比较必须是丹麦语,在这种情况下排序是正确的。

+0

它的工作原理。谢谢 – User

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 
0

这是一个问题的CultureInfo(或功能)。

大家谁回答,前缀码YOUT:

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

丹麦的文化,你会得到相同的结果,奇作为问题的作者日期。

我在阅读@ feaster对原始文章的评论后发现此解决方案。

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

相关问题