昨天在客戶現場遇到一個很奇葩的問題,猜下下面代碼的排序輸出是什么:
static void Main(){ List<string> strs = new List<string>(){"11", "12", "1:"}; foreach(string str in strs.OrderBy(n => n)) Console.writeLine(str);}是這個么:
11121:
No, No, No。實際輸出了這個:
1:1112
為什么?冒號的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#排序輸出結果不一致。哪位熟悉CLR的博友可以告訴我原因么?
新聞熱點
疑難解答