You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何从List<int>中获取连续数字(不优先使用LINQ)?及特定列表元素提取问题求助

如何从列表中获取连续数字(非LINQ优先方案)

首先先提个小细节:List<int>.Add()方法一次只能添加一个元素,你写的ints.Add(1,5,6)是不符合语法的,正确的初始化方式应该是这样:

List<int> ints = new List<int> { 1, 5, 6 };
// 或者分开逐个添加:
// List<int> ints = new List<int>();
// ints.Add(1);
// ints.Add(5);
// ints.Add(6);

接下来我们用不依赖LINQ的方案来实现需求,核心思路就是遍历列表,检查当前元素和下一个元素是否是连续递增1的,符合条件就把它们提取到新列表里:

非LINQ实现代码

List<int> ints = new List<int> { 1, 5, 6 };
List<int> newList = new List<int>();

// 遍历到倒数第二个元素就行,因为要对比当前和下一个元素
for (int i = 0; i < ints.Count - 1; i++)
{
    // 判断下一个元素是否等于当前元素+1,满足就是连续数字
    if (ints[i + 1] == ints[i] + 1)
    {
        // 避免重复添加(比如遇到1,2,3这种连续三个数时,2不会被重复加入)
        if (!newList.Contains(ints[i]))
            newList.Add(ints[i]);
        if (!newList.Contains(ints[i + 1]))
            newList.Add(ints[i + 1]);
    }
}

// 验证结果,这里会输出5和6
foreach (var num in newList)
{
    Console.WriteLine(num);
}

代码简单解释:

  • for循环逐个检查相邻元素对,确保不遗漏任何可能的连续组合
  • 通过Contains判断元素是否已在新列表,避免重复添加(如果你的场景不会出现连续三个及以上的数字,这步可以省略)
  • 逻辑直白易懂,适合非技术专家快速理解

额外补充:正确的LINQ写法(供参考)

你之前的LINQ代码逻辑没踩中要点,这里给个能实现需求的LINQ写法,方便你对比:

List<int> ints = new List<int> { 1, 5, 6 };
// 先配对相邻元素,再筛选连续的对,最后合并元素去重
var consecutivePairs = ints.Zip(ints.Skip(1), (current, next) => new { current, next })
                           .Where(pair => pair.next == pair.current + 1);

List<int> newList = consecutivePairs.SelectMany(pair => new[] { pair.current, pair.next })
                                   .Distinct()
                                   .ToList();

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

火山引擎 最新活动