static void Main(string[] args) { List<InstanceInformation> infos = new List<InstanceInformation>() { new InstanceInformation(){ SeriesID = "A", StudyID = "A1", PatientID = "P1" }, new InstanceInformation(){ SeriesID = "A", StudyID = "A1", PatientID = "P1" }, new InstanceInformation(){ SeriesID = "A", StudyID = "A1", PatientID = "P2" }, new InstanceInformation(){ SeriesID = "A", StudyID = "A2", PatientID = "P1" }, new InstanceInformation(){ SeriesID = "B", StudyID = "B1", PatientID = "P1"}, new InstanceInformation(){ SeriesID = "B", StudyID = "B1", PatientID = "P1"}, }; IEnumerable<IGrouping<string, InstanceInformation>> bySeries = infos.GroupBy(g => g.SeriesID); IEnumerable<IGrouping<string, InstanceInformation>> byStudy = bySeries.SelectMany(g => g.GroupBy(g_inner => g_inner.StudyID)); IEnumerable<IGrouping<string, InstanceInformation>> byPatient = byStudy.SelectMany(g => g.GroupBy(g_inner => g_inner.PatientID)); foreach (IGrouping<string, InstanceInformation> group in byPatient) { Console.WriteLine(group.Key); foreach(InstanceInformation II in group) Console.WriteLine(" " + II.ToString()); } }