我不确定这个问题是否重复,因为我费了好大劲才找到这个问题,因为基本上我不知道功能名称是什么。如果是这样,我深表歉意。
举个例子,一个团队有个人,这个人有几个电话号码,我想按号码分组,仍然维护与团队相关的所有信息。所以基本上让属性 Number 成为我的 groupby 的关键。
public class PhoneNumber
{
public string Number { get; set; }
}
public class Person
{
public List<PhoneNumber> PhoneNumbers { get; set; }
}
public class Team
{
public List<Person> Persons{ get; set; }
}
IEnumerable<Team> teams = new List<Team>();
所以我想做类似的事情:
Team.Persons.GroupBy(i=> i.PhoneNumbers.Number)
显然我不能,因为 PhoneNumbers 是一个列表
最终结果应该是这样的
- Number1234 -> Team1, Team2
- Number5678 -> Team1, Team2, Team3
其中 NumberX 是 groupby 键,TeamX 包含与拥有该电话号码的成员的团队相关的信息。
我的方法可能完全不适用于此示例,因此我们将不胜感激任何反馈。
最佳答案
基本上,您需要将结果拉平,以便获得团队/号码对,然后您可以按号码分组。例如:
// IEnumerable<IGrouping<string, Team>>
var grouped = from team in teams
from person in team.Persons
from number in person.PhoneNumbers
group team by number.Number;
您可能还想考虑创建一个 Lookup
而不是分组:
// ILookup<string, Team>
var lookup = (from team in teams
from person in team.Persons
from number in person.PhoneNumbers
select new { team, number }).ToLookup(p => p.number.Number,
p => p.team);
通过查找,您可以执行以下操作:
var number = "...";
foreach (var team in lookup[number])
{
...
}
...如果您询问电话号码未知的团队,它会返回一个空序列。
关于c# - LINQ GroupBy child 的 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27186773/