我正在構建具有日記功能的應用程序,並且在該對象內有一個約會列表。爲了顯示目的,我有一個要求以下列格式使用Linq擴展方法創建嵌套分組
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; }
本質視圖模型,我長組:
目前我已經使用此代碼解決了這個問題將數據按Office
分組,然後使用resultSelector
重載來投影原始對象。然後,我將該IGrouping
結果轉換爲Dictionary
,其中密鑰爲office,值爲Appointment
類型的列表。從我然後Room
分組Appointment
類型的每個列表,創建一個字典,它與主要Office
生產型Dictionary
內的字典,然後用鑰匙Room
和Appointment
作爲值到每個密鑰列表字典。
此代碼產生所需的結果,但我認爲這很難閱讀,在循環中更難以理解的視圖,可能效率很低。
有人可以提供一些建議,因爲我可以簡單地實現我想要的結果嗎?
沒有什麼不對您的代碼。我認爲這是一個相當不錯的LINQ查詢。 你可以通過引入將採取的IEnumerable'',並返回'詞典<室,預約>'一個輔助方法,使它有點清潔。有了這個,你可以在你的ToDictionary調用中調用它,這將簡化查詢。您也可以在'GroupBy'調用中跳過'k => k' +使用'a'和'g'來代替更直觀的'k'。 'Appointments.GroupBy(A => a.Office).ToDictionary(G => g.Key,G => GroupByRoom(G));' 但我不認爲這是值得做的事情。在我看來,查詢是好的。 –
MarcinJuraszek
我同意@MarcinJuraszek其實它很容易閱讀和理解,也很有效。在第一個「GroupBy」和「ToList」之前,唯一的冗餘是'k => k'。 –