How to use GroupBy on multiple columns in LINQ with C#

How to use GroupBy on multiple columns in LINQ with C#

To use GroupBy on multiple columns in LINQ with C#, you can create an anonymous type or a tuple as the key for grouping. Here's an example using both approaches:

  • Add the following using statement:
using System.Linq; 
  • Define a sample class and create a list:
public class Person { public string FirstName { get; set; } public string LastName { get; set; } public string City { get; set; } } List<Person> people = new List<Person> { new Person { FirstName = "John", LastName = "Doe", City = "New York" }, new Person { FirstName = "Jane", LastName = "Doe", City = "New York" }, new Person { FirstName = "Alice", LastName = "Johnson", City = "Los Angeles" }, new Person { FirstName = "Bob", LastName = "Smith", City = "Los Angeles" }, new Person { FirstName = "Charlie", LastName = "Smith", City = "New York" } }; 

Approach 1: Using anonymous types

var groups = people.GroupBy(p => new { p.LastName, p.City }); foreach (var group in groups) { Console.WriteLine($"Group: LastName = {group.Key.LastName}, City = {group.Key.City}"); foreach (var person in group) { Console.WriteLine($" {person.FirstName} {person.LastName} - {person.City}"); } } 

Approach 2: Using tuples (C# 7.0 and later)

var groups = people.GroupBy(p => (p.LastName, p.City)); foreach (var group in groups) { Console.WriteLine($"Group: LastName = {group.Key.LastName}, City = {group.Key.City}"); foreach (var person in group) { Console.WriteLine($" {person.FirstName} {person.LastName} - {person.City}"); } } 

In both approaches, the GroupBy method is called with a key selector that combines multiple properties into an anonymous type or a tuple. The rest of the code iterates through the groups and prints the group's key (the combination of LastName and City) and the people in each group.

Note that tuples require C# 7.0 or later. If you're using an earlier version of C#, you'll need to use the anonymous type approach.

Examples

  1. C# LINQ GroupBy multiple columns example:

    var persons = new List<Person> { /* List of Person objects */ }; var groupedPersons = persons.GroupBy(person => new { person.City, person.Age }); foreach (var group in groupedPersons) { Console.WriteLine($"City: {group.Key.City}, Age: {group.Key.Age}, Count: {group.Count()}"); } 
  2. Using GroupBy with multiple columns in LINQ C#:

    var persons = new List<Person> { /* List of Person objects */ }; var groupedPersons = persons.GroupBy(person => new { person.City, person.Age }); foreach (var group in groupedPersons) { Console.WriteLine($"City: {group.Key.City}, Age: {group.Key.Age}, Count: {group.Count()}"); } 
  3. C# LINQ GroupBy with anonymous type for multiple columns:

    var sales = new List<Sale> { /* List of Sale objects */ }; var groupedSales = sales.GroupBy(sale => new { sale.ProductId, sale.Date }); foreach (var group in groupedSales) { Console.WriteLine($"Product: {group.Key.ProductId}, Date: {group.Key.Date}, Count: {group.Count()}"); } 
  4. C# LINQ GroupBy and Sum on multiple columns:

    var sales = new List<Sale> { /* List of Sale objects */ }; var totalSalesByProduct = sales.GroupBy(sale => new { sale.ProductId, sale.Category }, (key, group) => new { ProductId = key.ProductId, Category = key.Category, TotalSales = group.Sum(s => s.Amount) }); 
  5. GroupBy and OrderBy on multiple columns in LINQ C#:

    var persons = new List<Person> { /* List of Person objects */ }; var orderedGroups = persons.GroupBy(person => new { person.City, person.Age }).OrderBy(group => group.Key.City).ThenBy(group => group.Key.Age); foreach (var group in orderedGroups) { Console.WriteLine($"City: {group.Key.City}, Age: {group.Key.Age}, Count: {group.Count()}"); } 
  6. GroupBy and Average on multiple columns in LINQ C#:

    var sales = new List<Sale> { /* List of Sale objects */ }; var averageSalesByProduct = sales.GroupBy(sale => new { sale.ProductId, sale.Category }, (key, group) => new { ProductId = key.ProductId, Category = key.Category, AverageSales = group.Average(s => s.Amount) }); 
  7. GroupBy with multiple keys using named tuple in LINQ C#:

    var persons = new List<Person> { /* List of Person objects */ }; var groupedPersons = persons.GroupBy(person => (person.City, person.Age)); foreach (var group in groupedPersons) { Console.WriteLine($"City: {group.Key.City}, Age: {group.Key.Age}, Count: {group.Count()}"); } 
  8. C# LINQ GroupBy and Max on multiple columns:

    var sales = new List<Sale> { /* List of Sale objects */ }; var maxSalesByProduct = sales.GroupBy(sale => new { sale.ProductId, sale.Category }, (key, group) => new { ProductId = key.ProductId, Category = key.Category, MaxSales = group.Max(s => s.Amount) }); 
  9. GroupBy and Sum with condition on multiple columns in LINQ C#:

    var sales = new List<Sale> { /* List of Sale objects */ }; var totalSalesByProduct = sales.GroupBy(sale => new { sale.ProductId, sale.Category }, (key, group) => new { ProductId = key.ProductId, Category = key.Category, TotalSales = group.Where(s => s.Date.Year == 2023).Sum(s => s.Amount) }); 
  10. GroupBy with multiple keys and Count distinct in LINQ C#:

    var persons = new List<Person> { /* List of Person objects */ }; var distinctCounts = persons.GroupBy(person => new { person.City, person.Age }).Count(); Console.WriteLine($"Distinct Counts: {distinctCounts}"); 

More Tags

gradle-dependencies user-experience touch favicon popupwindow identity hyperledger unique-values dplyr android-keypad

More Programming Guides

Other Guides

More Programming Examples