代码:
var recordsList = list.GroupBy(u => u.state)
.Select(grp => grp.ToList())
.ToList();
state
字段的取值为Approved
、Review
、Planning
、Scheduled
。我想将记录订购为组,首先获取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>
(其中T
是state
的任何类型)来反映您的排序顺序。
然后您可以使用OrderBy
和comparer
实例按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));
}
}