分组后,如何使用首选项(特定字段名)对列表进行排序

本文关键字:字段 列表 排序 何使用 首选项 | 更新日期: 2023-09-27 17:51:26

代码:

var recordsList = list.GroupBy(u => u.state)
                                        .Select(grp => grp.ToList())
                                        .ToList();

state字段的取值为ApprovedReviewPlanningScheduled。我想将记录订购为组,首先获取state具有Approved,然后state具有Review,然后state具有Planning,最后显示state具有Scheduled记录。

分组后,如何使用首选项(特定字段名)对列表进行排序

您可以使用以下代码:

var recordsList = list.GroupBy(u => u.state)
    .OrderBy(grp => StateToOrder(grp.Key))
    .Select(grp => grp.ToList())
    .ToList();

这个方法用于排序不同的状态

public int StateToOrder(string state)
    {
        switch (state)
        {
            case "Approved":
                return 1;
            case "Review":
                return 2;
            case "Planning":
                return 3;
            case "Scheduled":
                return 4;
            default:
                return 5;
        }
    }

如果这些字段值映射到Enum (int),那么排序应该正常工作?

如果可能,将string属性更改为您自己定义的Enum。然后你可以用这个来订购:

var recordsList = list.GroupBy(u => u.state)
                      .OrderBy(grp => grp.Key)
                      .Select(grp => grp.ToList())
                      .ToList();

或者,您可以创建自己的比较器,它以正确的方式排序。

您需要实现IComparer<T>(其中Tstate的任何类型)来反映您的排序顺序。

然后您可以使用OrderBycomparer实例按Key(这是state)排序您的组:

var recordsList = list.GroupBy(u => u.state)
    .OrderBy(grp => grp.Key, comparer)
    .Select(grp => grp.ToList())
    .ToList();
比较器的一个非常基本的实现可能是:
public class StateComparer : IComparer<string>
{
    private static readonly List<string> Order = new List<string>
    {
        "Approved",
        "Review",
        "Planning",
        "Scheduled"
    };
    public int Compare(string x, string y)
    {
        return Order.IndexOf(x).CompareTo(Order.IndexOf(y));
    }
}