以数学方式添加多个列表

时间:2017-09-18 13:40:33

标签: c#

我坚持使用List<List<int>>的方法,并希望获取每个索引的每个List<int>的值并将它们加在一起。
具体来说:

intList1[0] + intList2[0] + intList3[0]  
intList1[1] + intList2[1] + intList3[1]

虽然每个列表中的列表数量和项目数量都不固定。 结果应为List<int>,其中包含每个总和。

4 个答案:

答案 0 :(得分:3)

您可以通过lists将所有SelectMany合并在一起,然后按照初始index对其进行分组,然后进行Sum()计算:

var answer = lists.SelectMany(x => x.Select((item,index) => new {item,index}).ToList())
       .GroupBy(x => x.index).Select(x => x.Sum(y => y.item)).ToList();

答案 1 :(得分:0)

使用与子列表中元素的最大数量相同的大小初始化结果列表,然后只需循环到子列表中即可汇总不同的值。

int maximumNumberElements = listContainer.Max(l => l.Count);
List<int> resultList = new List<int>();

for(int i = 0; i < maximumNumberElements; i++)
{
    resultList.Add(0);
}

for(int i = 0; i < listContainer.Count; i++)
{
    for(int j = 0; j < listContainer[i].Count; j++)
    {
        resultList[j] += listContainer[i][j];
    }
}

答案 2 :(得分:0)

我喜欢这些问题的字典方法,你也可以存储一些有趣的东西以及字典的价值,例如,总结该索引的项目数等。

// Dictionary of indexes to sums
var sums = new Dictionary<int, int>();

// Iterate your lists.
foreach(var list in lists) {
    for (var i = 0; i < list.Count; i++) {
        // For the given index, sum up the values in the dictionary.
        if (sums.TryGetValue(i, var out value) == false) sums[i] = 0;
        sums[i] = sums[i] + list[i];
    }
}

答案 3 :(得分:0)

如果列表较大,另一种解决方案可能会更好

public static IEnumerable<int> ListSum(IEnumerable<IEnumerable<int>> ll)
{
    var resultList = new List<int>();
    var enumerators = ll.Select(l => l.GetEnumerator()).ToArray();
    bool stillResult;
    do
    {
        stillResult = false;
        var sum = 0;
        foreach (var e in enumerators)
        {
            if (e.MoveNext())
            {
                sum += e.Current;
                stillResult = true;
            }
        }
        resultList.Add(sum);
    } while (stillResult);

    return resultList;
}