You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中如何用LINQ按索引求和嵌套列表元素生成单列表?

按索引对嵌套列表元素求和的LINQ实现及性能分析

我有10个List<(int item1, int item2)>类型的列表,每个列表包含10个元素,已合并为List<List<(int item1, int item2)>> listofLists。希望用LINQ按相同索引对所有列表的元素求和,得到单个List<(int item1, int item2)>列表。目前已通过双重循环实现(代码如下),想了解LINQ的实现方式,以及LINQ是否更优:

List<(int length, int count)> result = new();

int column = 0;                

while (column < averages[0].Count) // averages 即 listofLists
{
    (int length, int count) cumulative = (0, 0);

    for (int i = 0; i < averages.Count; i++)
    {
        cumulative.length += averages[i].ElementAt(column).length;
        cumulative.count += averages[i].ElementAt(column).count;
    }
    result.Add(cumulative);
    column++;
}

LINQ实现方式

可以通过Enumerable.Range生成索引范围,再结合Aggregate对每个索引位置的元素进行累加,代码如下:

var result = Enumerable.Range(0, listofLists[0].Count)
    .Select(index => listofLists.Aggregate(
        (length: 0, count: 0),
        (sum, currentList) => (
            sum.length + currentList[index].item1,
            sum.count + currentList[index].item2
        )
    ))
    .ToList();

代码说明

  1. Enumerable.Range(0, listofLists[0].Count):生成从0到子列表长度-1的索引序列,对应每个需要求和的位置。
  2. Select(index => ...):遍历每个索引,计算该位置所有子列表元素的累加值。
  3. Aggregate:初始化一个累加元组(0,0),依次遍历每个子列表,将当前索引位置的item1和item2分别累加到总和中。

LINQ与手动循环的优劣对比

可读性

LINQ代码更简洁直观,直接用声明式语法表达“按索引聚合求和”的业务逻辑,不需要手动管理循环变量,降低了出错概率,也更容易理解。

性能

在你当前的场景(10个列表各10个元素)下,两者性能几乎没有差异。如果数据量极大,手动循环可能会有极其微小的性能优势——因为LINQ的委托调用会带来少量开销,但现代.NET的JIT编译器会对这类代码做大量优化,实际运行差距可以忽略不计。

边界处理

两种方式的行为一致:如果子列表长度不一致,访问索引时都会抛出IndexOutOfRangeException。如果需要兼容子列表长度不同的场景,两者都需要额外添加逻辑(比如取所有子列表的最小长度作为遍历范围)。

内容的提问来源于stack exchange,提问作者Humble Newbie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 09:10:21