C#默認OrderBy()函數的排序問題

昨天在客戶現場遇到一個很奇葩的問題,猜下下面代碼的排序輸出是什麼: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#排序

相關文章
相關標籤/搜索