我有一个从web api请求返回的对象列表。每个对象都有一个名为" PlaceNo"其值可以是0到n,如果没有赋值,则为-1。
我需要根据PlaceNo订购列表,其中需要为0到n,然后是所有-1。
allreports.OrderBy(x => Convert.ToInt32(x.PlaceNo)).ToList();
当前代码首先给出所有-1,然后是0到n。
注意:我在PlaceNo上进行类型转换,因为数字是以字符串而不是整数形式传递的。
答案 0 :(得分:8)
解决此问题的正确方法是按顺序执行查询。虽然其他答案的建议 - 将负数转换为最大值 - 将可能的工作,最好的做法是编写代码,使其实际代表您尝试在代码中捕获的操作。在这种情况下,您有两个排序条件,因此您应该在查询中有两个排序条件!
你想要做的是先做一个订单 - "是整数-1?"也就是说,订购布尔数量。默认排序是false在true之前,所以如果你想要-1-last最后排序,检查整数是否等于-1。
那应该是你的order-by子句。那么then-by子句就是你的正常排序 - 用整数值。
var query = from report in allreports
let place = Convert.ToInt32(report.PlaceNo)
orderby place == -1, place
select report;
var list = query.ToList();
有意义吗?
答案 1 :(得分:2)
allreports.OrderBy(x => {
var placeNo = Convert.ToInt32(x.PlaceNo);
return placeNo == -1 ? Int32.MaxValue : placeNo;
}).ToList();
这段代码是未经测试的,我只是把它写在我的头顶,所以随时纠正任何编译错误。
答案 2 :(得分:0)
尝试以下方法:
allreports.OrderBy(x => Convert.ToInt32(x.PlaceNo) < 0 ? Int32.MaxValue : Convert.ToInt32(x.PlaceNo));