我正在构建一个具有日记功能的应用程序,并且在该对象中有一个约会列表。出于显示目的,我需要以下列格式创建嵌套分组
Heading 1
Sub-heading 1
Data row 1
Data row 2
Sub-heading 2
Data row 1
Data row 2
Heading 2
Sub-heading 1
Data row 1
Data row 2
其中,标题是约会所在的办公室,而子标题是其所在的房间。在查看以下模型时,这将更有意义;
public class Diary
{
public int Id {get; set; }
public DateTime DiaryDate {get; set; }
List<Appointment> Appointments {get; set;}
}
public class Appointment
{
public int Id {get; set;}
public int DiaryId {get; set;}
public DateTime StartTime {get; set;}
public DateTime EndTime {get; set; }
public string Attendees {get; set; }
public Office Office {get; set; }
public Room Room {get; set; }
}
Office
是一个包含办公地点的枚举,Room
也包含有空间。
目前我使用此代码解决了这个问题:
Appointments.GroupBy(k => k.Office, k => k)
.ToDictionary(k => k.Key,
k => k.ToList().GroupBy(sk => sk.Room)
.ToDictionary(mk => mk.Key, mk => mk.ToList()));
我正在将日记写入视图模型,其中约会的类型为
public Dictionary<Office, Dictionary<Room, List<Appointment>>> Appointments { get; set; }
基本上,我的long group by语句按Office
对数据进行分组,然后使用resultSelector
重载来投影原始对象。然后,我将IGrouping
结果转换为Dictionary
,其中键为office,值为Appointment
类型的列表。然后,我将Appointment
的每个类型的列表按Room
分组,在字典中创建一个字典,使用键Dictionary
生成类型Office
,然后生成字典密钥Room
和Appointment
列表作为每个密钥的值。
这段代码产生了预期的结果,但我认为它很难阅读,在循环中更难以理解,并且效率可能非常低。
有人可以提供一些建议,因为我可以简单地按照我实现预期结果的方式吗?
答案 0 :(得分:0)
您实际上正在构建一个查找,一个每个键具有多个值的字典。只需使用它。
您的查询只会变为:
var query = appointments.OrderBy(a => a.Office).ThenBy(a => a.Room)
.GroupBy(a => a.Office)
.ToDictionary(g => g.Key, g => g.ToLookup(a => a.Room));