按字符串中的整数排序依据

时间:2013-09-12 12:18:15

标签: c#

我的C#应用​​程序出了问题...我在数据库中有一些学校课程,例如8-B,9-A,10-C,11-C等......当我使用时order by子句对它们进行排序,字符串比较将结果显示为

10-C
11-C
8-B
9-A

但是我希望在string中存在的第一个整数的基础上进行整数排序... 即。

8-B
9-A
10-C
11-C

希望你能理解...... 我试过这个,但它抛出异常

var query = cx.Classes.Select(x=>x.Name)
                .OrderBy( x=>  new string(x.TakeWhile(char.IsDigit).ToArray()));

请帮助我...想要根据课程订购......

4 个答案:

答案 0 :(得分:5)

也许Split可以吗?

.OrderBy(x => Convert.ToInt32(x.Split('-')[0]))
.ThenBy(x => x.Split('-')[1])

答案 1 :(得分:1)

如果输入结构良好,可以这样做:

        var maxLen = cx.Classes.Max(x => x.Name.Length);
        var query =  cx.Classes.Select(x => x.Name).OrderBy(x => x.PadLeft(maxLen));

答案 2 :(得分:0)

您可以将指定长度的左边距填充0添加为例如6的数据

.OrderBy(x => x.PadLeft(6, '0'))

答案 3 :(得分:0)

这与Andrius's answer的基本方法基本相同,更明确地写出:

var names = new[] { "10-C", "8-B", "9-A", "11-C" };

var sortedNames =
    (from name in names
     let parts = name.Split('-')
     select new {
         fullName = name,
         number = Convert.ToInt32(parts[0]),
         letter = parts[1]
     })
    .OrderBy(x => x.number)
    .ThenBy(x => x.letter)
    .Select(x => x.fullName);

这是我天真的假设,这会更有效,因为Split只在初始选择中处理一次,而不是在OrderBy和ThenBy中处理,但是对于所有我知道LINQ的额外“层”可能会超过任何收获。