根据多个因素排序列表

时间:2014-02-14 14:40:30

标签: c# .net linq

鉴于以下类别:

public class Room
{
    public List<Person> People {get;set;}
    public string RoomType {get;set;}
}

public class Person
{
    public bool IsLead{get;set;}
}

鉴于我有一个包含人员列表的房间列表,我如何以这样的方式订购

  • 有序列表中的第一个房间是潜在客户所在的房间。
  • 所有相同类型的房间都互相追随

请注意,只有一个人是领导者。

示例数据:

  • doubleroom nonlead
  • 单人房无铅
  • singleroom lead
  • doubleroom nonlead

有序:

  • singleroom lead
  • 单人房无铅
  • doubleroom nonlead
  • doubleroom nonlead

1 个答案:

答案 0 :(得分:4)

这是一种简单有效的方法:

var orderedRooms = rooms
    .OrderBy(room => !room.People.Any(person => person.IsLead)) // room with lead will be first
    .GroupBy(room => room.RoomType) // RoomType with lead will be first
    .SelectMany(group => group); // flatten the list of groups into one list

此查询符合以下要求:

  • 有序列表中的第一个房间是潜在客户所在的房间。
  • 所有相同类型的房间互相追随。

但是,按字母顺序对房间类型进行排序。