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行的结果直接初始化的。它正在工作:。