昨天在客戶現場遇到一個很奇葩的問題,猜下下面代碼的排序輸出是什麼:html
static void Main() { List<string> strs = new List<string>(){"11", "12", "1:"}; foreach(string str in strs.OrderBy(n => n)) Console.writeLine(str); }
是這個麼:python
11 12 1:
No, No, No。實際輸出了這個:算法
1: 11 12
爲何?冒號的ASCII碼值不是在0~9的後面麼?我也沒搞懂爲何C#的默認Sorter是按照這個順序排序的。好在OrderBy()函數支持自定義Sorter,像下面同樣修改下就好了。函數
static void Main() { OrdinalComparer comp = new OrdinalComparer(); List<string> strs = new List<string>(){"11", "12", "1:"}; foreach(string str in strs.OrderBy(n => n, comp)) Console.writeLine(str); } public class OrdinalComparer: System.Collections.Generic.IComparer<String> { public int Compare(String x, String y) { return string.CompareOrdinal(x, y); } }
不過仍是不知道爲何OrderBy的默認排序要設置成這樣,Python2.3的默認排序就是按ASCII碼排的。這致使我和別人寫了同一個算法,結果python和C#排序輸出結果不一致。htm
分類: .Netblog
標籤: C#排序