Linq- 按自定义顺序发布

本文关键字:顺序 自定义 Linq- | 更新日期: 2023-09-27 18:33:56

var CustomStatus = new[] { "PAG", "ASG", "WIP", "COMP", "SEN" };
List<CDSHelper> HelperList = new List<CDSHelper>();
// Getting the values from API to fill the object and
// finally doing the custom order by
var result = HelperList.OrderBy(a => Array.IndexOf(CustomStatus, a.status));

我正在使用自定义顺序对帮助程序列表对象进行排序。我总共有大约 18 个状态。在 18 种状态中,我想根据自定义状态对列表进行排序,其余的顺序应该在自定义状态状态之后出现在列表中。使用上面的代码,我可以在帮助程序列表的末尾获取自定义状态。如何实现这一点?

Linq- 按自定义顺序发布

可能最简单的方法是使用 OrderBy 然后ThenBy但是您需要更改-1 IndexOf如果项目不存在,将返回为更高的值,因此不在列表中的项目将成为最后一个。

var result = HelperList.OrderBy(a => {
                         var x = Array.IndexOf(CustomStatus, a.status);
                         if(x < 0)
                            x = int.MaxValue;
                         return x;
                     }).ThenBy(a => a.status); //Sort alphabetically for the ties at the end.

另一种方法是颠倒CustomStatus的顺序,然后使用OrderByDecending

var CustomStatus = new[] { "SEN", "COMP", "WIP", "ASG","PAG" };
List<CDSHelper> HelperList = new List<CDSHelper>();
// Getting the values from API to fill the object and
// finally doing the custom order by
var result = HelperList.OrderByDecending(a => Array.IndexOf(CustomStatus, a.status))
                       .ThenBy(a.status);

CustomStatus创建一个HashSet。您不需要知道状态的索引CustomStatus您只需要知道它是否在列表中。HashSet中的查找是一个 O(1) 操作。在数组中,它是 O(n):

var CustomStatus = new HashSet<string> { "PAG", "ASG", "WIP", "COMP", "SEN" };
var result = HelperList.OrderBy(a => !CustomStatus.Contains(a.status))
                       .ThenBy(a => a.status).ToList();

OrderBy按从 !CustomStatus.Contains(a.status) 返回的布尔值对列表进行排序。首先是HashSet中包含的所有值,然后是其余值。然后按状态的字母顺序对每个组进行排序。