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

分类: .Net

标签: C#

转载于:https://my.oschina.net/airship/blog/3004700

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值