C# 通过使用LINQ分组,将多个整数列表相加为一个整数

C# 通过使用LINQ分组,将多个整数列表相加为一个整数,c#,.net,linq,C#,.net,Linq,我有一份物品清单 指定的项目如下所示: public class Item { public List<decimal> Values { get; set; } public string GroupingKey { get; set; } public List<int> Cycle { get; set; } } 公共类项目 { 公共列表值{get;set;} 公共字符串GroupingKey{get;set;} 公共列表循环{get;

我有一份物品清单

指定的项目如下所示:

public class Item
{
    public List<decimal> Values { get; set; }

    public string GroupingKey { get; set; }

    public List<int> Cycle { get; set; }
}
公共类项目
{
公共列表值{get;set;}
公共字符串GroupingKey{get;set;}
公共列表循环{get;set;}
}
我想通过在列表中按索引对键值和求和值进行分组,并将其添加到一个列表中,从而对项实例列表进行分组。循环列表对于每个组都是相同的,所以只需将其添加到新组中即可

例如,以下列表:

List<Items>
{
    Values { 2, 3, 5 },
    GroupingKey = "P23",
    Cycle { 1, 2, 3, 4 }
},
{
    Values { 10, 20, 30 },
    GroupingKey = "P23",
    Cycle { 1, 2, 3, 4 }
},
{
    Values { 10, 20, 30 },
    GroupingKey = "P24",
    Cycle { 1, 2, 3, 4 }
}
列表
{
值{2,3,5},
GroupingKey=“P23”,
循环{1,2,3,4}
},
{
值{10,20,30},
GroupingKey=“P23”,
循环{1,2,3,4}
},
{
值{10,20,30},
GroupingKey=“P24”,
循环{1,2,3,4}
}
最终会看起来像:

List<Items>
{
    Values { 12, 23, 35},
    GroupingKey = "P23",
    Cycle { 1, 2, 3, 4}
},
{
    Values { 10, 20, 30},
    GroupingKey = "P24",
    Cycle { 1, 2, 3, 4}
}
列表
{
值{12,23,35},
GroupingKey=“P23”,
循环{1,2,3,4}
},
{
值{10,20,30},
GroupingKey=“P24”,
循环{1,2,3,4}
}
具有相同键的项实例可以是多个,而不仅仅是两个。 关于如何使用LINQ解决这个问题,有什么想法吗

谢谢。

您需要的是一种跨多个序列工作的方法。不幸的是,LINQ没有提供这样的功能,所以我们必须手动投影索引和求和元素

    var merged = items
        .GroupBy(x => x.GroupingKey)
        .Select(grp => new Item
        {
            Values = Enumerable
                .Range(0, grp.Max(x => x.Values.Count))
                .Select(i => grp.Sum(x => x.Values.Count > i ? x.Values[i] : 0))
                .ToList(),
            GroupingKey = grp.Key,
            Cycle = grp.First().Cycle   // can add check that others are identical
        })
        .ToList();

您可以通过使用一组
GroupBy
Select
来实现这一点:

var result = list.GroupBy(i => i.GroupingKey).ToList().Select(group => new Item
{
    Values = group.SelectMany(item => item.Values
                .Select((value, index) => new {value, index}))
                      .GroupBy(item => item.index)
                      .Select(a => a.Sum(e => e.value)).ToList(),
    GroupingKey = group.Select(i => i.GroupingKey).FirstOrDefault(),
    Cycle = group.Select(i => i.Cycle).FirstOrDefault()
});

到目前为止你试过什么?那个么你们在哪里卡住了呢?分组并将循环列表带到新的循环列表并不是问题。。。我坚持按索引添加值