2

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

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

但我想根据字符串中存在的第一个整数进行整数排序......即

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

4 回答 4

5

也许Split会做?

.OrderBy(x => Convert.ToInt32(x.Split('-')[0]))
.ThenBy(x => x.Split('-')[1])
于 2013-09-12T12:22:24.757 回答
1

如果输入格式足够好,则可以这样做:

        var maxLen = cx.Classes.Max(x => x.Name.Length);
        var query =  cx.Classes.Select(x => x.Name).OrderBy(x => x.PadLeft(maxLen));
于 2013-09-12T12:47:49.990 回答
0

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

.OrderBy(x => x.PadLeft(6, '0'))
于 2013-09-12T12:38:24.520 回答
0

这与Andrius 的回答基本相同,写得更明确:

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 的额外“层”可能会超过任何收益。

于 2013-09-12T13:00:53.657 回答