【问题标题】:Order by problem in List (linq related)按列表中的问题排序(linq 相关)
【发布时间】:2011-09-05 14:42:49
【问题描述】:

我对如何订购列表有疑问。 我有一个产品清单,我按价格对它们进行排序。但在我的数据库中,我有两个价格:价格和报价。

我想按价格对我的产品进行排序,但是如果报价>0,那么我想按报价排序

我想到了这个,但它不起作用:

list.OrderBy(p => p.offer != 0 ? p.offer : p.price );

有什么想法吗??

【问题讨论】:

  • 为什么不起作用?错误是什么?预期结果与实际结果如何?
  • @Smudge202 不考虑报价,按价格排序
  • 你使用的代码是不是一模一样?
  • @R. Martinho Fernandes 是的,它是相同的代码..

标签: asp.net-mvc linq list


【解决方案1】:

正如有人所说,OrderBy 没有就地排序。它返回一个IOrderedEnumerable(它类似于IEnumerable,但是是有序的:-))。

如果您想就地排序(并且您使用的是List<>),请执行以下操作:

list.Sort((p, q) => (p.offer != 0 ? p.offer : p.price).CompareTo(q.offer != 0 ? q.offer : q.price));

【讨论】:

    【解决方案2】:

    也许您可以创建一个新列表,其中包含一个名为最终价格的字段,如果报价 > 0 则等于报价,否则等于价格。然后排序,然后得到最终的列表。

    var new_list = list.Select(element => new { new_price = element.offer > 0 ? element.offer : element.price, element });
    var ordered_new_list = new_list.OrderBy(element => element.new_price);
    var ordered_List = ordered_new_list.Select(element => element.element);
    

    【讨论】:

    • 我看不出这段代码的行为应该与发布的原始代码有何不同(除了缺少的分配)。愿意开导我吗?我在这里错过了什么?
    【解决方案3】:

    OrderBy 不会就地排序。它返回一个有序序列而不修改原始序列。您需要分配结果:

    var sortedList = list.OrderBy(p => p.offer > 0 ? p.offer : p.price).ToList();
    

    【讨论】:

    • 不.. 仍然不考虑报价价值
    • @mathew:我发布的代码有效:ideone.com/H3etj。也许我误解了你的要求,或者你在其他地方有另一个问题。
    猜你喜欢
    • 2021-10-23
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多