分组然后展平项目

Gra*_*ark 9 c# linq

我有一个具有以下属性的对象列表:

int TownId, int CompanyId, int ProductId, int[] Prices
Run Code Online (Sandbox Code Playgroud)

我想把它变成一个TownCompany对象列表; 每个项目具有以下属性:

int TownId, int CompanyId, int[] Products, int[] Prices
Run Code Online (Sandbox Code Playgroud)

所以我能做到

flatList.GroupBy(l => new { l.TownId, l.CompanyId })
Run Code Online (Sandbox Code Playgroud)

获取组列表,其中包含每个城镇/公司对的所有产品和价格.现在,对于此查找中的每个键,我想要展平/合并所有值.好像我应该可以使用SelectMany,但我总是对它提供的预测有点困惑......

如何将此组列表转换为每个键的展平列表列表?我希望我有道理.

例:

如果我的原始列表是这样的:

new[] {
    new Item { TownId = 1, CompanyId = 10, ProductId = 100, Prices = new [] { 1, 2 } },
    new Item { TownId = 1, CompanyId = 10, ProductId = 101, Prices = new [] { 3 } },
};
Run Code Online (Sandbox Code Playgroud)

我想要一个如下所示的列表:

{
    { TownId: 1, CompanyId: 10, Products: [100, 101], Prices: [1, 2, 3] }
}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 15

SelectMany只需要Prices; 因为ProductId它很简单Select:

flatList
.GroupBy(l => new { l.TownId, l.CompanyId })
.Select(g => new {
    g.Key.TownId
,   g.Key.CompanyId
,   ProductIds = g.Select(o => o.ProductId).ToArray()
,   Prices = g.SelectMany(o => o.Prices).ToArray()
});
Run Code Online (Sandbox Code Playgroud)

  • 好吧,至少他改变了换行符. (4认同)
  • @Mario由于您的年龄超过2K,您可以自由编辑其他人的答案,您的编辑将立即显示,而无需等待批准.将别人的答案复制为你的答案并不是正确的行动方案,除非修复相当实际(这绝对不是这种情况). (3认同)
  • 很容易.实际上,只要我看到问题的编辑并理解OP的含义,我就会在没有您答案的情况下创建代码.由于我已经给出了答案,我急忙创建新的解决方案,直到你回答完之后才发现.我后来唯一复制的是`.ToArray()`. (2认同)
  • @Mario当然,你做到了.而且你还通过纯巧合为lambda中的每个变量选择了相同的名称.但是,说真的,当你犯了错误时,最好承认它,继续前进.它让每个人都有些恶化. (2认同)

Mar*_*num 13

如果我理解正确,那么这样的事情:

flatList.GroupBy(l => new { l.TownId, l.CompanyId })
        .Select(g => new 
        {
            TownId = g.Key.TownId,
            CompanyId = g.Key.CompanyId,   
            Products = g.Select(o => o.ProductId).ToArray(),
            Prices = g.SelectMany(o => o.Prices).ToArray()
        });
Run Code Online (Sandbox Code Playgroud)

  • @GrahamClark"协作"是一个完全不适合描述发生的事情的词. (7认同)