Linq声明:按

时间:2016-05-12 00:34:56

标签: c# linq c#-4.0 lambda

我有一个从web api请求返回的对象列表。每个对象都有一个名为" PlaceNo"其值可以是0到n,如果没有赋值,则为-1。

我需要根据PlaceNo订购列表,其中需要为0到n,然后是所有-1。

allreports.OrderBy(x => Convert.ToInt32(x.PlaceNo)).ToList();

当前代码首先给出所有-1,然后是0到n。

注意:我在PlaceNo上进行类型转换,因为数字是以字符串而不是整数形式传递的。

3 个答案:

答案 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));