我们可以使用arr.Sum()
函数进行求和。但如果它是一个数组数组。我们如何添加所有值。
假设数据是
数组/列表是[[1,2,3],[3,4,5],[5,4,3]]
你将如何使用LINQ获得s1,所有第一个索引值的总和,s2,第二个索引值的总和等。
答案 0 :(得分:6)
如果你想总结列'值借助 Linq :
int[][] source = new int[][] {
new int[] { 1, 2, 3},
new int[] { 3, 4, 5},
new int[] { 5, 4, 3},
};
int maxCol = source.Max(item => item.Length);
var colsSum = Enumerable
.Range(0, maxCol)
.Select(index => source.Sum(item => item.Length > index ? item[index] : 0))
.ToArray(); // let's meaterialize into an array
测试:
Console.Write(string.Join(", ", colsSum));
结果:
9, 10, 11
总结行'值更容易:
// [6, 12, 12]
var linesSum = source
.Select(item => item.Sum())
.ToArray();
如果您想要总计总和:
// 30
var total = source
.Select(item => item.Sum())
.Sum();
或
// 30
var total = source
.SelectMany(item => item)
.Sum();
答案 1 :(得分:0)
使用Aggregate
和Zip
var arrays = new[]
{
new[] { 1, 2, 3 },
new[] { 3, 4, 5 },
new[] { 5, 4, 3 }
};
var result =
arrays.Aggregate(Enumerable.Repeat(0, 3),
(total, array) => total.Zip(array, (sum, current) => sum + current));
// result = { 9, 10, 11 }
Enumerable<T>.Zip
使用相同索引的项执行提供的函数。
答案 2 :(得分:0)
一种可能的基于LINQ的方法(将处理每行中可变数量的列):
using System;
using System.Collections.Generic;
using System.Linq;
namespace Test
{
public class Program
{
private static IEnumerable<int> GetTotalsPerColumn(int[][] inputData)
{
var data = inputData.SelectMany(z =>
{
return z.Select((item, index) => new { item, index });
})
.GroupBy(z => z.index)
.OrderBy(z => z.Key)
.Select(y => y.Select(z => z.item).Sum()
);
return data;
}
static void Main(string[] args)
{
var inputData = new[] {
new[] { 1, 2, 3, 5},
new[] { 3, 4, 5, 6},
new[] { 5, 4, 3},
};
var values = GetTotalsPerColumn(inputData);
foreach (var value in values)
{
Console.WriteLine(value);
}
Console.ReadLine();
}
}
}
如果您乐意避免使用LINQ,这是您可以考虑的另一种方法。
GetTotalsPerColumn
填充Dictionary
,其中键是列号,值是总和。
using System;
using System.Collections.Generic;
namespace Test
{
public class Program
{
static void Main(string[] args)
{
var inputData = new[] {
new[] { 1, 2, 3, 5},
new[] { 3, 4, 5, 6},
new[] { 5, 4, 3},
};
var values = GetTotalsPerColumn(inputData);
foreach (var value in values)
{
Console.WriteLine(value.Key + " - " + value.Value);
}
Console.ReadLine();
}
private static Dictionary<int, int> GetTotalsPerColumn(int[][] inputData)
{
var values = new Dictionary<int, int>();
foreach (var line in inputData)
{
for (int i = 0; i < line.Length; i++)
{
int tempValue;
values.TryGetValue(i, out tempValue);
tempValue += line[i];
values[i] = tempValue;
}
}
return values;
}
}
}