2012-02-20 68 views
13

我列出這樣字符串排序問題

List<string> items = new List<string>(); 
    items.Add("-"); 
    items.Add("."); 
    items.Add("a-"); 
    items.Add("a."); 
    items.Add("a-a"); 
    items.Add("a.a"); 

    items.Sort(); 

    string output = string.Empty; 
    foreach (string s in items) 
    { 
     output += s + Environment.NewLine; 
    } 

MessageBox.Show(output); 

輸出回來作爲

- 
. 
a- 
a. 
a.a 
a-a 

在那裏,因爲我期待的結果

​​

任何想法爲什麼「aa」不在「aa」之前,「a-」在「a」之前。

回答

4

如果你希望你的字符串排序到:使用序號比較使用

 Console.WriteLine(string.Compare("a.", "a-"));     //1 
    Console.WriteLine(string.Compare("a.a", "a-a"));    //-1 

    Console.WriteLine(string.Compare("a.", "a-", StringComparison.Ordinal)); //1 
    Console.WriteLine(string.Compare("a.a", "a-a", StringComparison.Ordinal)); //1 

排序原始集合基於實際的字節值,而不是由當前文化定義的規則,您可以按Ordinal排序:

items.Sort(StringComparer.Ordinal);

這將使結果在所有的文化是一致的(但它會產生「14」的直觀分類法,之前的「9」,這可能是也可能不是你要找的到來)。

+0

謝謝Jared,你能告訴我如何排序數據是否在DataTable DataTable dataTable = new DataTable()列中。 dataTable.Columns.Add(「Item」,typeof(string)); dataRow = dataTable.NewRow(); dataRow [「Item」] =「a-a」; dataTable.Rows.Add(dataRow); dataRow = dataTable.NewRow(); dataRow [「Item」] =「a.a」; dataTable.Rows.Add(dataRow); 的DataRow []行= dataTable.Select( 「」, 「項目ASC」);' – Satya 2012-02-20 01:42:42

4

List<>類的Sort方法依賴於.NET框架中,這實際上是Thread的當前CultureInfo的一個實例的默認string比較器。

CultureInfo指定字符的字母順序,它似乎默認使用順序不同於您所期望的順序。

排序時,你可以指定一個特定CultureInfo,一個你知道會符合​​您的排序要求,來樣(德國文化):

var sortCulture = new CultureInfo("de-DE"); 
items.Sort(sortCulture); 

更多信息可以在這裏找到:
http://msdn.microsoft.com/en-us/library/b0zbh7b6.aspx
http://msdn.microsoft.com/de-de/library/system.stringcomparer.aspx

+0

什麼還不清楚的是「 - 」(連字符)之前來之前(點)和‘A-’,「」‘一。’爲什麼不在'aa'之前'aa'? – Satya 2012-02-20 01:15:54

+0

從理論上講,現在的文化可能會認爲'.'和'-'是同一個順序,'.Sort'方法是「unstable」,這意味着等項目 – 2012-02-20 01:20:38

+1

我測試了美國英語,並得到了與OP相同的結果,即使在使用String.Compare進行測試時,我也沒有得到0(等於),我得到-1或1,這取決於哪個是第一個。它可能是不符合的.sort方法的問題 – 2012-02-20 01:22:02

15

我懷疑在最後一種情況下,由於特定於文化的設置(可能作爲「破折號」而不是第一個字符串中的「減號」),「 - 」以不同的方式處理。 MSDN warns有關此:

比較使用當前培養以獲得培養物特異性 信息,例如套管規則和 單個字符的字母順序。例如,文化可以指定將某些字符組合看作單個字符,或者將大寫字母和小寫字符以特定方式進行比較,或者可以將字符的排序順序依賴於前面的字符 或跟着它。

this MSDN page另見:

.NET框架使用排序的三種不同的方式:字排序, 串排序和順序排序。字排序執行文化敏感的 字符串比較。某些非字母數字字符可能有 分配給它們的特殊權重;例如,連字符(「 - 」)可能會分配一個很小的權重,以便「coop」和「co-op」 在排序列表中彼此相鄰。字符串排序與 字詞排序類似,只是沒有特殊情況;因此,所有 非字母數字符號都出現在所有字母數字字符之前。 序號排序根據字符串的每個 元素的Unicode值來比較字符串。

因此,連字符在默認排序模式中得到了一個特殊的處理,以使字詞排序更「自然」。

你可以得到「正常」的順序排序,如果你專門打開它:

 items.Sort(StringComparer.Ordinal); 
+0

我想你破解了,字排序,似乎這裏是問題 – ntziolis 2012-02-20 01:35:07

+0

@ntziolis:看起來這是C確實如此。您可以提取從DataColumn的數據到一個列表,並在排序: – 2012-02-20 01:37:23

+0

如果數據是在一個DataTable – Satya 2012-02-20 01:49:37