C# 以数学方式添加多个列表

C# 以数学方式添加多个列表,c#,C#,我一直在使用一种方法,在这种方法中,我有一个列表,并希望获取每个列表的每个索引值,然后将它们相加。 具体而言: intList1[0] + intList2[0] + intList3[0] intList1[1] + intList2[1] + intList3[1] 虽然列表的数量和每个列表中的项目数量不是固定的。 然后,结果应该是一个包含每个总和的列表。以与子列表中最大元素数相同的大小初始化结果列表,然后简单地循环到子列表中以对不同的值求和 int maximumNumberElem

我一直在使用一种方法,在这种方法中,我有一个
列表
,并希望获取每个
列表
的每个索引值,然后将它们相加。
具体而言:

intList1[0] + intList2[0] + intList3[0]  
intList1[1] + intList2[1] + intList3[1]
虽然列表的数量和每个列表中的项目数量不是固定的。
然后,结果应该是一个包含每个总和的
列表。

以与子列表中最大元素数相同的大小初始化结果列表,然后简单地循环到子列表中以对不同的值求和

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];
    }
}
int-maximumnumberrelations=listContainer.Max(l=>l.Count);
列表结果列表=新列表();
对于(int i=0;i
您可以通过
SelectMany
将所有
列表
合并在一起,然后通过初始
索引
对它们进行分组,然后使用后续的
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();

对于这类问题,我喜欢dictionary方法,您还可以在dictionary的值旁边存储一些有趣的内容,比如,为索引汇总的项目数等等

// 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];
    }
}
//总和索引字典
var sums=新字典();
//迭代你的列表。
foreach(列表中的变量列表){
对于(var i=0;i
对于较大的列表,另一种解决方案可能更好

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;
}
公共静态IEnumerable列表和(IEnumerable ll)
{
var resultList=新列表();
var enumerators=ll.Select(l=>l.GetEnumerator()).ToArray();
布尔结果;
做
{
stillResult=false;
var总和=0;
foreach(枚举数中的变量e)
{
if(如MoveNext())
{
总和+=e.电流;
stillResult=true;
}
}
结果列表。添加(总和);
}while(stillResult);
返回结果列表;
}

您的代码在哪里!到目前为止你尝试了什么?Linq expression SelectMany可以合并列表。我认为OP不想简单地合并列表。所以你想要子列表的总和?您能提供一些示例数据和预期输出以使其更清晰吗?我觉得
List
不是最佳设计选择。这可以使用检查来确保没有子列表比
listContainer[0]
@EdPlunkett短,如果一个子列表更大怎么办?@Fildor问得好。可能总和列表应该是
listContainer.Max(l=>l.Count)
,循环应该为子列表中缺少的值填充零。OP应该说明这一点。另外,lsuka,这不应该调用
.Count()
<代码>列表
具有
计数
属性。@EdPlunkett答案已使用您的建议进行了修改。问题在于列表大小是由LINQ行的结果直接初始化的。它正在工作:。