2013-08-27 54 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。

相關問題