c# - LINQ GroupBy child 的 child

标签 c# linq

我不确定这个问题是否重复,因为我费了好大劲才找到这个问题,因为基本上我不知道功能名称是什么。如果是这样,我深表歉意。

举个例子,一个团队有个人,这个人有几个电话号码,我想按号码分组,仍然维护与团队相关的所有信息。所以基本上让属性 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/

相关文章:

c# - 使用动态表达式对组进行 IQueryable LINQ 转换错误

c# - 使用反射从列表中检索值

c# - 从数据库返回 List<int>

c# - 我如何优化此 linq 函数以计算 "OrePreviste"的总和?

c# - 无法创建常量值。只有原始类型

c# - 从两个不同的输入上传两个不同的文件

c# - 将多个表从 SQL Server 导出到 XML 以进行还原

c# - 将 uint 复制到字节数组并在字节数组中进行比较(并返回)的最快方法

c# - Newtonsoft.Json.Linq.JArray' 键入 'System.Collections.Generic.IEnumerable

c# - 修补相关数据 ASP.NET Core Web API