LINQ:给定一个对象列表,创建一个以子对象为键,父对象为值的字典

时间:2009-10-29 03:57:04

标签: c# linq

我有这两个类

public class Person
{
}
public class Company
{
 public List<Person> Persons
{get;set;}
}

挑战:给出公司列表(即List<Company> Companies)。使用密钥dictionary创建Person,并将其所属的Company列表作为值。请注意,一个Person 可以属于多个Companies

我只对LINQ解决方案感兴趣;蛮力搜索和收集不是我想要的。

1 个答案:

答案 0 :(得分:7)

我认为这样做会:

var dictionary = (from company in companies
                  from person in company.Persons
                  group company by person).ToDictionary(x => x.Key,
                                                        x => x.ToList());

或者,改为使用Lookup:

var lookup = company.SelectMany(company => company.Persons,
                                (company, person) => new { company, person })
                    .ToLookup(x => x.person, x => x.company)
                    .ToDictionary(x=>x.Key, x => x.ToList()) ;

请注意,这两个非常“强力搜索和收集” - 只是该暴力强制的代码是在LINQ而不是在C#中。如果您正在使用LINQ to SQL(等),那么这意味着可以在数据库中完成强制执行。