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


昨天在客戶現場遇到一個很奇葩的問題,猜下下面代碼的排序輸出是什么:

static void Main()
{
    List<string> strs = new List<string>(){"11", "12", "1:"};
    foreach(string str in strs.OrderBy(n => n))
        Console.writeLine(str);
}

是這個么:

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#排序輸出結果不一致。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM