我的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()));
请帮助我...想要根据课程订购......
答案 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的额外“层”可能会超过任何收获。