分组然后展平项目

时间:2012-11-09 11:50:45

标签: c# linq

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

int TownId, int CompanyId, int ProductId, int[] Prices

我想将其转换为TownCompany个对象的列表;每个项目具有以下属性:

int TownId, int CompanyId, int[] Products, int[] Prices

所以我可以做到

flatList.GroupBy(l => new { l.TownId, l.CompanyId })

获取组列表,其中包含每个城镇/公司对的所有产品和价格。现在,对于此查找中的每个键,我想要展平/合并所有值。似乎我应该可以使用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 } },
};

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

{
    { TownId: 1, CompanyId: 10, Products: [100, 101], Prices: [1, 2, 3] }
}

2 个答案:

答案 0 :(得分: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()
});

答案 1 :(得分: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()
        });