私は日記機能を持つアプリケーションを構築しており、そのオブジェクトには予定のリストがあります。表示目的のために私は見出しが任命がであることオフィスで、サブ見出しが、これが中であることを部屋である。これは、ようになります次の形式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
を各鍵の値として使用して辞書を作成します。
このコードでは望ましい結果が得られますが、読みにくく、ループ時には理解しにくく、おそらく非常に非効率です。
誰かが私が望む結果を達成する方法をいくつかアドバイスできますか?
あなたのコードと間違って何もありません。私はそれがかなり良いLINQクエリだと思います。 'IEnumerable'を取って 'Dictionary 'を返すヘルパーメソッドを導入することで、少しきれいにすることができます。これを使って、あなたの 'ToDictionary'呼び出しの中で呼び出すことができます。これはクエリを少し簡略化します。 'GroupBy'コールで' k => k'をスキップすることもできます。より直感的な 'k'の代わりに' a'と 'g'を使うこともできます。 'Appointments.GroupBy(a => a.Office).ToDictionary(g => g.Key、g => GroupByRoom(g));' しかし、それは価値があるとは思わない。私の意見では、クエリはそのままです。 –
MarcinJuraszek
私は@MarcinJuraszekに同意します。実際、読みやすく理解しやすく、効率的です。唯一の冗長は、最初の 'GroupBy'の' k => k'と秒の前の 'ToList'です。 –