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()
});
到目前为止你试过什么?那个么你们在哪里卡住了呢?分组并将循环列表带到新的循环列表并不是问题。。。我坚持按索引添加值