C# 如何对按其他字段分组的列表进行排序
我有一个事件对象列表:C# 如何对按其他字段分组的列表进行排序,c#,.net,C#,.net,我有一个事件对象列表: class Event { private int eventId; private int categoryId; private int eventOrder; } 按eventOrder字段排序后,结果如下: Event (eventId = 11, categoryId = 3, eventOrder = 1) Event (eventId = 44, categoryId = 2, eventOrder = 2) Event (eve
class Event {
private int eventId;
private int categoryId;
private int eventOrder;
}
按eventOrder字段排序后,结果如下:
Event (eventId = 11, categoryId = 3, eventOrder = 1)
Event (eventId = 44, categoryId = 2, eventOrder = 2)
Event (eventId = 33, categoryId = 3, eventOrder = 3)
Event (eventId = 55, categoryId = 4, eventOrder = 4)
Event (eventId = 22, categoryId = 1, eventOrder = 5)
如果我按eventOrder排序,然后按categoryId排序,结果是:
Event (eventId = 55, categoryId = 4, eventOrder = 4)
Event (eventId = 11, categoryId = 3, eventOrder = 1)
Event (eventId = 33, categoryId = 3, eventOrder = 3)
Event (eventId = 22, categoryId = 2, eventOrder = 5)
Event (eventId = 44, categoryId = 1, eventOrder = 2)
我需要尊重较低的事件顺序来安排事件,但类别需要是连续的,预期结果:
Event (eventId = 11, categoryId = 3, eventOrder = 1)
Event (eventId = 33, categoryId = 3, eventOrder = 3)
Event (eventId = 44, categoryId = 1, eventOrder = 2)
Event (eventId = 55, categoryId = 4, eventOrder = 4)
Event (eventId = 22, categoryId = 2, eventOrder = 5)
总之:事件需要按类别中最低的事件顺序排序。
我可以用比较器实现吗?您必须按
类别ID
进行分组,然后按每组中最小的事件顺序进行排序。我还在categoryId
上添加了一个二级排序,但这仅在eventOrder
不唯一时才需要。排序后,您可以使用选择many
取消分组
var eventList = new List<Event>
{
new Event {eventId = 11, categoryId = 3, eventOrder = 1},
new Event {eventId = 44, categoryId = 2, eventOrder = 2},
new Event {eventId = 33, categoryId = 3, eventOrder = 3},
new Event {eventId = 55, categoryId = 4, eventOrder = 4},
new Event {eventId = 22, categoryId = 1, eventOrder = 5}
};
var sortedResult = eventList.GroupBy(x => x.categoryId)
.OrderBy(x => x.Min(y => y.eventOrder))
.ThenBy(x => x.Key)
.SelectMany(x => x)
.ToList();
foreach (var item in sortedResult)
Console.WriteLine($"Event (eventId = {item.eventId}, categoryId = {item.categoryId}, eventOrder = {item.eventOrder})");
您可以使用LinqOrderByDescending
和ThenBy
来实现这一点。我编辑了问题以澄清问题,我无法在按事件顺序对ir排序后按类别ID对列表进行排序,我只需移动匹配类别ID的位置。如果我按事件顺序排序,然后按类别ID排序,结果是:Event(eventId=55,categoryId=4,eventOrder=4)
事件(eventId=11,categoryId=3,eventOrder=1)
事件(eventId=33,categoryId=3,eventOrder=3)
事件(eventId=22,categoryId=2,eventOrder=5)
事件(eventId=44,categoryId=1,eventOrder=2)
我想我现在明白你的问题了。很抱歉将其标记为重复。
Event (eventId = 11, categoryId = 3, eventOrder = 1)
Event (eventId = 33, categoryId = 3, eventOrder = 3)
Event (eventId = 44, categoryId = 2, eventOrder = 2)
Event (eventId = 55, categoryId = 4, eventOrder = 4)
Event (eventId = 22, categoryId = 1, eventOrder = 5)