【问题标题】:Group By With Complex Selector使用复杂选择器分组
【发布时间】:2017-07-24 03:11:36
【问题描述】:

我的课程看起来像这样:

public class Foo
{
    public List<Bar> Bars { get; set; }

    // Other properties
}

public class Bar
{
    public string Name { get; set; }
}

我想做的是根据 Bar 列表中的匹配名称对 Foo 项目进行分组。

一些例子:

  • Foo1 与 Bars { Bar1, Bar2 } & Foo2 与 Bars { Bar1, Bar2 } => 2 团体
  • Foo1 with Bars { Bar1, Bar2 } & Foo2 with Bars { Bar2, Bar3 } => 3 组
  • Foo1 with Bars { Bar1, Bar2 } & Foo2 with Bars { Bar3, Bar4 } => 4 组

(注意:Foo 中还有其他属性可以用于分组。)

【问题讨论】:

  • 不太清楚你在这里问什么。你能举一个输入列表和预期输出的例子吗?
  • 我知道组的键会不同Bar.Name,但是您对组的期望值是多少?
  • 组的每个成员都是Foo 对象的集合,匹配的Bar 名称作为键(或其中一个键)。

标签: c# linq


【解决方案1】:

第 1 步:获取所有 Bar.Names,使用 .SelectMany

foos.SelectMany(f => f.Bars.Select(b => b.Name))

第 2 步:按第 1 步中的名称进行分组,但现在您只有名称,没有对应的 Foo,因此在第 1 步中,我们需要 Bar.NameFoo 作为新对象。

最终查询如下:

var grouped = foos
    .SelectMany(f => f.Bars
        .Select(b => new { Name = b.Name, Foo = f }))
    .GroupBy(o => o.Name, o => o.Foo);

您也可以在最后一个查询步骤中使用.ToLookup 代替.GroupBy

【讨论】:

    猜你喜欢
    • 2011-02-20
    • 1970-01-01
    • 2017-09-22
    • 2014-09-22
    • 1970-01-01
    • 2015-01-25
    • 2019-04-03
    • 1970-01-01
    • 2016-10-19
    相关资源
    最近更新 更多