2015-10-05 68 views
0

我正在使用Array.Sort()以及代碼中顯示的參數。我無法獲得所需的順序如下數組Array.Sort()不保留大小寫不敏感的比較器的元素順序

jONeS 
jones 
joNes 
jones 
aDaMs 
adams 
adaMS 
ADAMs 

顯示該程序打印以下

adams 
aDaMs 
adaMS 
ADAMs 
jONeS 
jones 
joNes 
jones 

凡爲根據我下面的順序應印

aDaMs 
adams 
adaMS 
ADAMs 
jONeS 
jones 
joNes 
jones 

請注意前兩個元素顯示錯誤。 我哪裏錯了?

int N = Convert.ToInt32(Console.ReadLine()); 
string[] arr=new string[N]; 
for (int i = 0; i < N; ++i) 
    arr[i] = Console.ReadLine(); 
Array.Sort(arr, StringComparer.Create(new CultureInfo("en-US"),true)); 
Console.WriteLine(); 
for (int i = 0; i < N; ++i) 
    Console.WriteLine(arr[i]); 
+2

我是唯一一個誰看'ADAMs',問怎麼來它是在不同的顏色? –

+2

我是否正確地假設你想在比較相等時保留元素的順序?如果是這樣,'Array.Sort()'使用Quicksort,這不是一個穩定的排序。只要兩個元素比較相等(所有Adamses和Joneses都是這種情況)* Adamses在Joneses之前出現的任何輸出都是正確的。如果您另外希望保留元素的原始順序,則需要像Mergesort這樣的穩定​​排序算法。 –

回答

3

正如吉榮Mostert說的Array.Sort不穩定(reference)在LINQ然而OrderBy是穩定的(reference),你可以使用它。

所以更換

Array.Sort(arr, StringComparer.Create(new CultureInfo("en-US"),true)); 

arr = arr.OrderBy(name=>name, StringComparer.Create(new CultureInfo("en-US"),true)).ToArray(); 
+0

當然'OrderBy'實際上不是對數組進行排序,而是創建一個新數組。但是這可能對該操作非常有用。 – Magnus