linq 具有空值的实体应该是通过使用C#中的order by排序后的最后一个实体

mkh04yzy  于 2023-07-31  发布在  C#
关注(0)|答案(2)|浏览(138)

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

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

字符串
这就是结果:

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


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

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

n9vozmp4

n9vozmp41#

你可以使用下面的技巧来做到这一点。

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();

字符串

cvxl0en2

cvxl0en22#

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

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

个字符
或者对同一个列表进行排序

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();

相关问题