如何通过索引总结List <int []>或锯齿状数组的每个数组?

时间:2016-08-05 07:49:38

标签: c# arrays linq aggregate

我想将这部分代码转换为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 },因为这是总和结果

4 个答案:

答案 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));