带嵌套列表的 LINQ 组

LINQ Group with nested list

我正在尝试使用 LINQ 对我的数据进行分组。这是我使用的模型:

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

我有 IEnumerable<Employees>,我想转换它:

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

为此:

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 };
};
...

因此,我需要以某种方式将'grouping' Groups Employee 的分组还原为Group Employees 的分组。我尝试将 GroupJoin EmployeesGroups 一起使用(通过 employee.SelectMany(e => e.Groups).Distinct(); 提取它们),但我的查询不起作用。有人可以帮我吗?

分组前需要使用SelectMany展开分组列表:

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

您也可以先识别组,然后再创建字典。

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

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

注意:如下所述,这将多次遍历源列表,如果 employees 很大,这可能会导致性能问题。