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})");

您可以使用Linq
OrderByDescending
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)