2016-06-25 78 views
0

我正在構建具有日記功能的應用程序,並且在該對象內有一個約會列表。爲了顯示目的,我有一個要求以下列格式使用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內的字典,然後用鑰匙RoomAppointment作爲值到每個密鑰列表字典。

此代碼產生所需的結果,但我認爲這很難閱讀,在循環中更難以理解的視圖,可能效率很低。

有人可以提供一些建議,因爲我可以簡單地實現我想要的結果嗎?

+1

沒有什麼不對您的代碼。我認爲這是一個相當不錯的LINQ查詢。 你可以通過引入將採取的IEnumerable'',並返回'詞典<室,預約>'一個輔助方法,使它有點清潔。有了這個,你可以在你的ToDictionary調用中調用它,這將簡化查詢。您也可以在'GroupBy'調用中跳過'k => k' +使用'a'和'g'來代替更直觀的'k'。 'Appointments.GroupBy(A => a.Office).ToDictionary(G => g.Key,G => GroupByRoom(G));' 但我不認爲這是值得做的事情。在我看來,查詢是好的。 – MarcinJuraszek

+0

我同意@MarcinJuraszek其實它很容易閱讀和理解,也很有效。在第一個「GroupBy」和「ToList」之前,唯一的冗餘是'k => k'。 –

回答

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