How to C# Linq Group By by paramater/field names

How to C# Linq Group By by paramater/field names

In C# LINQ, GroupBy is used to group elements in a collection based on a key and then perform operations on each group. It is similar to SQL GROUP BY.

Key concepts of LINQ GroupBy

Key (g.Key) → grouping value
Group → collection of items in each group
Returns IGrouping<TKey, TElement>

When to use GroupBy?

Use it when you need:

Data categorization (e.g., by department, city, type)
Aggregations (sum, count, average)
Reporting and analytics
Transforming flat data into grouped structure

Advantages of GroupBy

Very expressive and readable
Works well with aggregation functions
Avoids manual looping logic
Similar to SQL GROUP BY

Common mistakes

Forgetting to use .Select() after grouping when transforming output
Thinking GroupBy returns a list (it returns grouped collections)
Using it when sorting or filtering would be enough

LINQ GroupBy Examples

Consider that we have given a list of Employee's. Assume that Employee class have several parameters such as

• ID,
• Name,
• Surname,
• Address,
• CompanyID,
• etc.

The simplest group by statement can be written in C# Linq as given below.

Non-Query Linq Group By Example (Method Syntax)

var results = list.
              GroupBy(e => e.CompanyID).
              ToDictionary(e => e.Key, e => e.ToList());

where the results is a dictionary of CompanyID to the Employee's working at the same company. Query version can be written as given below.

Query Linq Group By Example (Query Syntax)

var results = from e in list
              group by e.CompanyID into g
              select new { CompanyID = g.Key, Employees = g.ToList() };

Now, we will give a "group by example" frequently used for client-service applications. Assume that, you have given the "group by" dimension as a String (e.g. var groupName = "CompanyID";).

Applying Linq Group by statement using Parameter/Field Name

var results = list.GroupBy(e => e.GetType().GetProperty(groupName).
              GetValue(e, null).ToString()).
              ToDictionary
(e => e.Key, e => e.ToList());

If you need multiple group by dimensions, considering that we have given list of groupNames, check the solution given below.

Multiple Group By statements for given parameter/field names

var results = list.GroupBy(e =>
              new Tuple<String, String>(
              e.GetType().GetProperty(groupNames[0]).
                GetValue(e, null).ToString(),
              e.GetType().GetProperty(groupNames[1]).
                GetValue(e, null).ToString())).
              ToDictionary
(e => e.Key, e => e.ToList());

You might apply more dimensions using a larger Tuple.

Iterating over groups

foreach (var group in results)
{
    Console.WriteLine(group.Key); // group name

    foreach (var student in group)
    {
        Console.WriteLine("  " + student.Name);
    }
}

Contents related to 'How to C# Linq Group By by paramater/field names'

Language-Integrated Query (Linq)
Language-Integrated Query (Linq)
Fastest way to test if there are any duplicates in a Java list/array
Fastest way to test if there are any duplicates in a Java list/array