具有 null 值的实体应该是在 C 中使用 order by 排序后的最后一个实体#

entity that has null value should be last entity after sorting by using order by in c#

提问人:Alireza Ahmadi 提问时间:7/15/2023 最后编辑:Vivek NunaAlireza Ahmadi 更新时间:7/21/2023 访问量:22

问:

我有一个列表,我想使用 Linq(order by method) 按“sortOrder”对其进行排序,列表中的一些实体具有“sortOrder”属性的 null 值,我想用以下规则对它们进行排序:每个在“sortOrder”属性中具有 null 值的实体,都将在我的列表的最后一个索引中(我不关心有多少实体可以有 null 值,也不关心排序具有 null 值的实体)

这是我的代码:

myList.Select(Map).OrderBy(a => a.SortOrder).ToList();

结果如下:

[
  {
    "SortOrder": null
  },
  {
    "SortOrder" : 2
  }
]

但这是我想要的,我不知道如何实现它:

[
  {
    "SortOrder": 2
  },
  {
    "SortOrder" : null
  }
]
C# 列表 LINQ 排序 null

评论


答:

1赞 Vivek Nuna 7/15/2023 #1

您可以使用如下所示的技巧来执行此操作。

List<MyEntity> myList = new List<MyEntity>
{
    new MyEntity { SortOrder = 2 },
    new MyEntity { SortOrder = null },
    new MyEntity { SortOrder = 1 },
};


List<MyEntity> sortedList = myList.OrderBy(e => e.SortOrder ?? int.MaxValue).ToList();

评论

0赞 Alireza Ahmadi 7/15/2023
哦,这当然有效,非常感谢伙计
0赞 Alireza Ahmadi 7/15/2023
我做到了,网站一开始不让我做
1赞 Charlieface 7/16/2023 #2

虽然@VivekNuna的答案有效并且可能是最简单的,但更惯用的方法是使用自定义比较器。

var comparer = Comparer<YourMapClass>.Create((a, b) =>
    a.SortOrder.HasValue
    ? b.SortOrder.HasValue
      ? a.SortOrder.Value.CompareTo(b.SortOrder.Value)
      : -1
    : 1
);
myList
  .Select(Map)
  .Order(comparer)
  .ToList();

或者对同一列表进行排序

myList.Sort(comparer);

您也可以为int?

var comparer = Comparer<int?>.Create((a, b) =>
    a.HasValue
    ? b.HasValue
      ? a.Value.CompareTo(b.Value)
      : -1
    : 1
);

并做

myList
  .Select(Map)
  .OrderBy(e => e.SortOrder, comparer)
  .ToList();

评论

0赞 Alireza Ahmadi 7/25/2023
感谢这些东西很酷