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)));
