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

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

4

2 回答 2

3

可能最简单的方法是使用OrderBythen但是如果该项目不存在,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.

另一种方法是颠倒CustomStatusthen 使用的顺序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);
于 2013-10-05T05:46:54.510 回答
0

为. HashSet_ CustomStatus您不需要知道状态的索引,CustomStatus您只需要知道它是否在列表中。在 a 中查找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其余的所有值。然后每个组按状态按字母顺序排列。

于 2013-10-05T06:38:51.570 回答