【问题标题】:Linq statement : Order byLinq 语句:按顺序排列
【发布时间】:2016-05-12 00:34:55
【问题描述】:

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

我需要根据 PlaceNo 对列表进行排序,它需要是 0 到 n ,然后是所有 -1。

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

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

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

【问题讨论】:

  • 最干净的方法是将它们分成两个列表,排序积极的,然后将它们连接起来
  • @Dr.Stitch。通过删除转换,它的排序根本不起作用。我刚刚测试过了。
  • 抱歉,因为我误读了您的问题,所以我删除了我的评论。我同意庞伯的观点。
  • @pomber :感谢您的建议。我肯定有这个想法,但我想知道我是否可以只使用一个 LINQ 语句直接做到这一点

标签: c# linq c#-4.0 lambda


【解决方案1】:

解决此问题的正确方法是进行 order-by-then-by 查询。 虽然其他答案的建议——将负数转换为最大 int——将可能有效,最佳实践是编写代码,以便它实际代表您试图在代码中捕获的操作。在这种情况下,您有 两个 排序条件,因此您应该在查询中有 两个 排序条件!

您要做的是首先对“整数是否为 -1?”进行排序。也就是说,按 Boolean 数量订购。默认排序是 false 在 true 之前,因此如果您希望 -1 排在最后,请检查整数是否等于 -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();

有意义吗?

【讨论】:

  • Aww .. 在这里我正要背诵你的答案。这是一个代码示例:dotnetfiddle.net/eoxZxA 非常相似,但有一点不同。
  • @Eric 性能方面,你认为这比我的回答中的 Int32.MaxValue 更快或更慢
  • @SirajMansour:你的代码是双向的。如果你想知道哪个更快,运行它们然后你就会知道了!
  • @SirajMansour:您是否相信我或其他任何人有某种神秘的能力来判断代码在不运行的情况下运行得有多快?绩效是一门经验学科,而不是理论学科。猜测两件事中哪一个更快的价值是值得你付出的;什么都没有。
  • @SirajMansour:您输入注释说您不会运行代码所花费的时间比运行代码所花费的时间要多。我不知道你为什么拒绝回答你的问题。
【解决方案2】:
allreports.OrderBy(x => {
  var placeNo = Convert.ToInt32(x.PlaceNo);
  return placeNo == -1 ? Int32.MaxValue : placeNo;
}).ToList();

此代码未经测试,我只是在脑海中写下此代码,因此请随时更正任何编译错误。

【讨论】:

    【解决方案3】:

    尝试以下方法:

    allreports.OrderBy(x => Convert.ToInt32(x.PlaceNo) < 0 ? Int32.MaxValue : Convert.ToInt32(x.PlaceNo));
    

    【讨论】:

    • 我不确定性能会受到怎样的影响,但是您将整数转换了两次。
    猜你喜欢
    • 2020-01-25
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 2011-01-12
    • 2019-12-29
    • 1970-01-01
    相关资源
    最近更新 更多