Linq声明:排序依据

Lib*_*eph 1 c# linq lambda c#-4.0

我有一个从web api请求返回的对象列表.每个对象都有一个名为"PlaceNo"的字段,其值可以为0到n,如果尚未分配值,则为-1.

我需要根据PlaceNo排序列表,其中需要为0到n,然后是所有-1.

allreports.OrderBy(x => Convert.ToInt32(x.PlaceNo)).ToList();
Run Code Online (Sandbox Code Playgroud)

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

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

Eri*_*ert 8

解决此问题的正确方法是按顺序执行查询.虽然其他答案的建议 - 将负数转换为最大值 - 可能会有效,但最佳做法是编写代码,使其实际代表您尝试在代码中捕获的操作.在这种情况下,您有两个排序条件,因此您应该在查询中有两个排序条件!

你想要做的是先做一个"是整数-1?"的订单.也就是说,对布尔数量的顺序.默认排序是false在true之前,所以如果你想要-1最后排序,检查整数是否等于-1.

那应该是你的订单条款.然后,then-by子句是您的正常排序 - 按整数值.

var query = from report in allreports
            let place = Convert.ToInt32(report.PlaceNo) 
            orderby place == -1, place 
            select report;
var list = query.ToList();
Run Code Online (Sandbox Code Playgroud)

合理?

  • @SirajMansour:你已经用两种方式编写了代码.如果你想知道哪个更快,**运行**然后你就会知道! (4认同)
  • @SirajMansour:你是否相信我或其他任何人有一些神秘的能力来告诉代码如何运行而不运行它?绩效是一种经验学科,而不是理论学科.猜测两件事中哪一件更快的价值值得你付出的代价; 什么都没有. (3认同)
  • @SirajMansour:你花了更多的时间来输入评论说你不会运行代码而不是运行代码.我不确定你为什么拒绝回答你的问题. (3认同)