如何从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




