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

如何使用C# LINQ实现列表元素的连续链式配对

嘿,我懂你遇到的问题了——你想要的是生成连续相邻的元素对,而不是所有可能的元素组合,之前用SelectMany结合Skip(i+1)的方式确实会生成全排列式的元素对,完全不符合你的需求。这里有几个靠谱的LINQ解决方案,你可以试试看:

方法1:用Zip实现(最简洁直观)

这是最推荐的方式,思路很简单:把原列表和“跳过第一个元素的原列表”做拉链配对,这样每个元素就会和它的下一个元素一一对应:

var numbers = new List<int> { 1, 2, 3, 4, 5 };
var consecutivePairs = numbers.Zip(numbers.Skip(1), (prev, next) => (prev, next));

// 输出验证
foreach (var pair in consecutivePairs)
{
    Console.WriteLine($"({pair.prev}, {pair.next})");
}

运行后你会得到正好想要的结果:(1, 2)、(2, 3)、(3, 4)、(4, 5)。原理是numbers.Skip(1)会生成{2,3,4,5},Zip方法会把两个列表中相同位置的元素组合,完美匹配相邻元素对的需求。

方法2:基于索引的Select实现(适合需要自定义逻辑的场景)

如果你需要更灵活的控制(比如中间要加一些判断逻辑),可以用带索引的Select,然后过滤掉最后一个没有下一个元素的项:

var numbers = new List<int> { 1, 2, 3, 4, 5 };
var consecutivePairs = numbers
    .Select((current, index) => 
        index < numbers.Count - 1 ? (current, numbers[index + 1]) : default)
    .Where(pair => pair != default);

这里通过索引判断,只处理到倒数第二个元素,确保每个元素都能找到下一个配对元素,最后过滤掉默认值(也就是最后一个元素生成的无效项)。

为什么你之前的方法不行?

你提到的SelectMany+Skip(i+1)的方式,逻辑是遍历每个元素后跳过前面i+1个元素,这样会生成所有“后面元素在当前元素之后”的组合,比如(1,3)、(1,4)这类非相邻的对,自然不是你想要的连续配对结果啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 18:02:29