使用Linq添加索引位置数组数组的值

时间:2017-07-06 12:32:39

标签: c# arrays linq

我们可以使用arr.Sum()函数进行求和。但如果它是一个数组数组。我们如何添加所有值。 假设数据是 数组/列表是[[1,2,3],[3,4,5],[5,4,3]] 你将如何使用LINQ获得s1,所有第一个索引值的总和,s2,第二个索引值的总和等。

3 个答案:

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

使用AggregateZip

的组合
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;
        }
    }
}