using System.Collections.Generic;
public static class Program
public static void Main()
List<StudentDetails> students = new List<StudentDetails>()
new StudentDetails {StudentId = 1, StudentName = "Bill", SubjectId = 1, SubjectName = "Math", ClassId = 1, ClassName = "10A"},
new StudentDetails {StudentId = 2, StudentName = "Fill", SubjectId = 2, SubjectName = "Literature", ClassId = 1, ClassName = "10A"},
new StudentDetails {StudentId = 3, StudentName = "Will", SubjectId = 1, SubjectName = "Math", ClassId = 2, ClassName = "10B"},
new StudentDetails {StudentId = 1, StudentName = "Bill", SubjectId = 3, SubjectName = "Physics", ClassId = 2, ClassName = "10B"},
new StudentDetails {StudentId = 1, StudentName = "Bill", SubjectId = 3, SubjectName = "Physics", ClassId = 1, ClassName = "10A"}
List<Class> classes = students
.GroupBy(s => s, new ComparerById<StudentDetails>(s => s.ClassId))
ClassName = c.Key.ClassName,
.GroupBy(s => s, new ComparerById<StudentDetails>(s => s.StudentId))
StudentId = s.Key.StudentId,
StudentName = s.Key.StudentName,
.GroupBy(t => t, new ComparerById<StudentDetails>(t => t.SubjectId))
.Select(t => new Subject {SubjectId = t.Key.SubjectId, SubjectName = t.Key.SubjectName})
foreach (Class @class in classes)
Console.WriteLine("Class({0}, {1})", @class.ClassId, @class.ClassName);
foreach (Student student in @class.Students)
Console.WriteLine("\tStudent({0}, {1})", student.StudentId, student.StudentName);
foreach (Subject subject in student.Subjects)
Console.WriteLine("\t\tSubject({0}, {1})", subject.SubjectId, subject.SubjectName);
public class StudentDetails
public int SubjectId { get; set; }
public string SubjectName { get; set; }
public int StudentId { get; set; }
public string StudentName { get; set; }
public int ClassId { get; set; }
public string ClassName { get; set; }
public int ClassId { get; set; }
public string ClassName { get; set; }
public List<Student> Students { get; set; }
public int StudentId { get; set; }
public string StudentName { get; set; }
public List<Subject> Subjects { get; set; }
public int SubjectId { get; set; }
public string SubjectName { get; set; }
public class ComparerById<T> : IEqualityComparer<T>
private readonly Func<T, int> _keySelector;
public ComparerById(Func<T, int> keySelector) { _keySelector = keySelector; }
public bool Equals(T x, T y) { return _keySelector(x) == _keySelector(y); }
public int GetHashCode(T obj) { return _keySelector(obj); }