2011-05-18 103 views
2

Hei, 我覺得順序是錯誤地排序的東西。示例代碼:C#LINQ錯誤排序

static void Main() 
{    
    // Create a delicious data source. 
    string[] fruits = { "äax", "ääü", "äbü" }; 

    // Query for ascending sort. 
    IEnumerable<string> sortAscendingQuery = 
     from fruit in fruits 
     orderby fruit //"ascending" is default 
     select fruit;  

    // Execute the query. 
    Console.WriteLine("Ascending:"); 
    foreach (string s in sortAscendingQuery) 
    { 
     Console.WriteLine(s); 
    } 
} 

而結果:

Ascending: 
ääü 
äax 
äbü 

正確的順序應該是: AAX 阿布 AAU

任何人都遇到過這樣的錯誤?

回答

2

此linq返回正確的結果 - 您需要指定要使用的字符串比較。

foreach (string s in fruits.OrderBy(s=>s, StringComparer.OrdinalIgnoreCase)) 
{ 
    Console.WriteLine(s); 
} 
8

這將使用默認實現IComparer<string>。這是一個文化敏感的比較,我相信這就是爲什麼它認爲「ääü」在「äax」之前。

您是否期待進行序數比較?如果是這樣,你可以明確指定比較器,但不能在查詢表達式:

IEnumerable<string> sortAscendingQuery = fruits 
    .OrderBy(fruit => fruit, StringComparer.Ordinal); 

如果這就是你要找沒有什麼,請解釋一下你需要什麼樣的比較。

+0

爲什麼我用來排序的字符串可以從數值到alphapedical或兩者在一起..在這種情況下我應該使用什麼比較? – hs2d 2011-05-18 13:07:06

+0

@ hs2d:完全取決於你想如何比較字符串。您可能希望提供您自己的'IComparer '的實現,您可以將它作爲第二個參數傳遞給'OrderBy'。 – 2011-05-18 13:12:52

+2

@ hs2d:您應該使用爲您的應用程序的用戶正確排序的那個。你是這裏唯一知道那是什麼的人! – 2011-05-18 13:13:04