In my journey exploring the amazing LINQ world, I stumbled upon the Grouping operator and was fascinated by the operation of grouping objects based on more than one property/field value using LINQ’s GroupBy method:
class Program { static void Main(string[] args) { var employees = new[] { new Employee() { Age = 23, Name = "Chris", JobTitle = "Mechanic" }, new Employee() { Age = 23, Name = "Greg", JobTitle = "Designer" }, new Employee() { Age = 32, Name = "Tapiwa", JobTitle = "Sales" }, new Employee() { Age = 24, Name = "Francis", JobTitle = "Developer" }, new Employee() { Age = 25, Name = "Brian", JobTitle = "Designer" }, new Employee() { Age = 23, Name = "Rodney", JobTitle = "Developer" }, }; var query = employees.GroupBy(x => x.Age); // Enumerate the results foreach (var grouping in query) { Console.WriteLine("Age {0}", grouping.Key); foreach (var emp in grouping) { Console.WriteLine("-- {0}", emp.Name); } } Console.WriteLine("\n"); // Using comprehension syntax: var q = from employee in employees group employee by employee.Age into grouping orderby grouping.Key select grouping; // Enumerate the results foreach (var grouping in q) { Console.WriteLine("Age {0}", grouping.Key); foreach (var emp in grouping) { Console.WriteLine("-- {0}", emp.Name); } } Console.WriteLine("\n"); // Group objects based on the value more than one field var q2 = employees.GroupBy(e => new { e.Age, e.JobTitle }); foreach (var grouping in q2) { Console.WriteLine("Age {0} and Job Title {1}", grouping.Key.Age, grouping.Key.JobTitle); foreach (var employee in grouping) { Console.WriteLine("-- {0}", employee.Name); } } Console.Read(); } } public class Employee { public int Age { get; set; } public string Name { get; set; } public string JobTitle { get; set; } }
I found yet another interesting operation with this where one can use the result of an aggregation on a grouping, for example:
var queryByJobTitle = from e in employees group e by e.JobTitle into g orderby g.Count() descending select g.Key; Console.WriteLine(queryByJobTitle.First()); // Designer