我想将这部分代码转换为LINQ。 任何人都可以帮助我吗?
var list = new List<int[]>();
list.Add(new int[] { 1, 2, 3, 4 });
list.Add(new int[] { 5, 4, 2, 1 });
list.Add(new int[] { 5, 9, 3, 5 });
var result = new int[4];
foreach (var item in list)
{
for (int i = 0; i < 4; i++)
{
result[i] += item[i];
}
}
结果必须是:{ 11, 15, 8, 10 }
,因为这是总和结果
答案 0 :(得分:4)
我认为这是最易读的版本。无需GroupBy
,您可以Sum
每个数组的每个索引:
int[] result = Enumerable.Range(0, 4)
.Select(index => list.Sum(arr => arr[index]))
.ToArray();
由于OP也使用0-3的for循环,它们似乎都具有相同的大小。
如果不是这种情况,您可以使用这种超级安全的方法:
int maxLength = list.Max(arr => arr.Length);
int[] result = Enumerable.Range(0, maxLength)
.Select(index => list.Sum(arr => arr.ElementAtOrDefault(index)))
.ToArray();
答案 1 :(得分:2)
首先出现在我的头上:
var list = new List<int[]>();
list.Add(new int[] { 1, 2, 3, 4 });
list.Add(new int[] { 5, 4, 2, 1 });
list.Add(new int[] { 5, 9, 3, 5 });
var result = list.SelectMany(item => item.Select((innerItem, index) => new { index, innerItem }))
.GroupBy(item => item.index, (key, group) => group.Sum(item => item.innerItem))
.ToList();
Tim的上述方法更清洁,更好
答案 2 :(得分:0)
你可以尝试这个
var list = new List<int[]>();
list.Add(new int[] { 1, 2, 3, 4 });
list.Add(new int[] { 5, 4, 2, 1 });
list.Add(new int[] { 5, 9, 3, 5 });
var result = list.SelectMany(x => x.Select((z, i) => new {z, i}))
.GroupBy(x=>x.i).Select(x=>x.Sum(z=>z.z)).ToArray();
答案 3 :(得分:0)
想要进行聚合,那么为什么不使用linq聚合?
var list = new List<int[]>();
list.Add(new int[] { 1, 2, 3, 4 });
list.Add(new int[] { 5, 4, 2, 1 });
list.Add(new int[] { 5, 9, 3, 5 });
var addArrayValues = new Func<int[], int[], int[]>(
(source, destination) =>
{
for (int i = 0; i < source.Length; i++)
destination[i] += source[i];
return destination;
});
var aggregateResult = list.Aggregate(new int[4],
(accumulator, current) => addArrayValues(current, accumulator));