2016-06-25 14 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のリストです。それから、タイプAppointmentの各リストをRoomでグループ化し、辞書(鍵Office)を作成し、次に辞書RoomとリストAppointmentを各鍵の値として使用して辞書を作成します。

このコードでは望ましい結果が得られますが、読みにくく、ループ時には理解しにくく、おそらく非常に非効率です。

誰かが私が望む結果を達成する方法をいくつかアドバイスできますか?

+1

あなたのコードと間違って何もありません。私はそれがかなり良いLINQクエリだと思います。 'IEnumerable 'を取って 'Dictionary 'を返すヘルパーメソッドを導入することで、少しきれいにすることができます。これを使って、あなたの 'ToDictionary'呼び出しの中で呼び出すことができます。これはクエリを少し簡略化します。 'GroupBy'コールで' k => k'をスキップすることもできます。より直感的な 'k'の代わりに' a'と 'g'を使うこともできます。 'Appointments.GroupBy(a => a.Office).ToDictionary(g => g.Key、g => GroupByRoom(g));' しかし、それは価値があるとは思わない。私の意見では、クエリはそのままです。 – MarcinJuraszek

+0

私は@MarcinJuraszekに同意します。実際、読みやすく理解しやすく、効率的です。唯一の冗長は、最初の 'GroupBy'の' k => k'と秒の前の 'ToList'です。 –

答えて

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)); 
関連する問題