【问题标题】:Custom ordering using LINQ使用 LINQ 自定义排序
【发布时间】:2020-06-06 12:01:01
【问题描述】:

我正在尝试将自定义 orderby 逻辑应用于列表对象。目前,我正在使用列表对象填充计划最大值和计划免赔额的下拉列表,并且在按以下值应用订单后,默认为计划免赔额。但我想自定义这个计划免赔额的顺序,而不是 0(零),我想显示下一个可用的最高值(即在这种情况下为 100)。这是输出 Dropdown

我已经浏览了下面的链接并应用了这个逻辑,但在我的情况下它不起作用 Linq OrderBy custom order Custom Linq Ordering

这里是代码

int[] customOrder = { 100, 0, 50, 150, 250, 500, 1000, 2500, 5000, 10000, 50000 };
var Result = lstQuatationResult
    .OrderBy(x => x.planMaximum)
    .OrderBy(x => x.planDeductible)
    .OrderBy(x => Array.IndexOf(customOrder, x));

提前致谢。

【问题讨论】:

  • 使用OrderBy(x => x.planMaximum).ThenBy(x => x.planDeductible).ThenBy(x => Array.IndexOf(customOrder, x));
  • 每个下一个OrderBy 子句都会重置之前的排序。
  • 你也可以举一些输入和期望输出的例子。
  • 这能回答你的问题吗? LINQ OrderBy versus ThenBy
  • 感谢大家的评论,但输出仍然不是我想要的。目前我正在获得 planDeductible 的输出,例如 0、50、100、150、250、500,但所需的输出是 100、0、50、150、250、500。

标签: c# .net linq sorting sql-order-by


【解决方案1】:

首先,每个OrderBy 子句都会重置之前的排序(如果它实际上会执行任何排序)。使用ThenBy 方法(或删除之前的排序):

var Result = lstQuatationResult
    .OrderBy(x => x.planMaximum)
    .ThenBy(x => x.planDeductible)
    .ThenBy(x => Array.IndexOf(customOrder, x)); // need to select some int field here

正如我在代码中提到的 - 您需要在最后一个 OrderBy 子句中选择 x 的字段,因为当前您的 Array.IndexOf 正在使用 IndexOf(Array array, object value) 重载并尝试在 @987654330 数组中查找对象@'s 并为所有传递的元素返回-1,基本上保持以前的顺序:

Console.WriteLine(Array.IndexOf(customOrder, new object())); // -1

UPD

试试:

var Result = lstQuatationResult.OrderBy(x => Array.IndexOf(customOrder, x.planDeductible));

如果这对您不起作用,请提供lstQuatationResult 的示例和所需的输出。

【讨论】:

  • 但是 planDeductible 的输出仍然不是如下所示,例如 0、50、100、150、250、500,但所需的输出是 100、0、50、150、250、500。自定义过滤器我猜是不工作。
  • @user13219048 删除除最后一个(.OrderBy(x => Array.IndexOf(customOrder, x.SomeField)))以外的所有订单并检查。
猜你喜欢
  • 2014-09-10
  • 1970-01-01
  • 2010-11-29
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-01
相关资源
最近更新 更多