Home > Enterprise >  LINQ Group with nested list
LINQ Group with nested list

Time:01-29

I'm trying to group my data using LINQ. This is the model I use:

public class Employee
{
   public string FirstName {get;set;}
   public string LastName {get;set;}
   public IEnumerable<string> Groups {get;set;}
}

And I have the IEnumerable<Employees> and I want to transform this:

FirstName=TestName1, SecondName=TestName1, Groups { Group1, Group2 },
FirstName=TestName2, SecondName=TestName2, Groups { Group1, Group3 }
...

To this:

Key=Group1,
Values:
{
   FirstName=TestName1, SecondName=TestName1, Groups { Group1, Group2 };
   FirstName=TestName2, SecondName=TestName2, Groups { Group1, Group3 };
};
Key=Group2,
Values:
{
   FirstName=TestName1, SecondName=TestName1, Groups { Group1, Group2 };
};
...

So, I need to somehow revert grouping from 'grouping' Groups by Employee, to grouping Employees by Group. I've tried to use GroupJoin Employees with Groups (extracted them by employee.SelectMany(e => e.Groups).Distinct();), but my queries don't work. Could someone help me please?

CodePudding user response:

You need to use SelectMany to expand the groups list before grouping:

List<Employee> employees = GetEmployees();
IEnumerable<IGrouping<string, Employee>> groupedEmployees = employees
    .SelectMany(employee => employee.Groups.Select(group => (employee, group)))
    .GroupBy(pair => pair.group, pair => pair.employee);

CodePudding user response:

You could alternatively identify the groups first and then create a dictionary.

var groups = employees
    .SelectMany(e => e.Groups)
    .Distinct();

var employeesByGroup = groups
    .ToDictionary(
        group => group,
        group => employees
            .Where(e => e.Groups.Contains(group)));
  •  Tags:  
  • Related