使用LINQ SkipWhile方法未达预期输出,禁用OrderBy如何调整?
问题分析与修正
你的程序确实存在问题,核心是对SkipWhile的逻辑理解有误,同时条件表达式完全不符合需求。
问题出在哪?
SkipWhile的工作逻辑是:从列表开头开始,只要元素满足条件就跳过,一旦遇到第一个不满足条件的元素,就停止跳过,保留该元素及之后的所有元素——它不是用来过滤所有满足条件的元素,只处理列表开头的连续满足项。
你写的条件i > 4 && x > 4,第一个元素索引i=0,显然不满足i>4,所以SkipWhile直接停止跳过操作,返回整个列表,这就是为什么你会得到全部元素的输出。
如何修正得到期望输出?
要得到8、9、10,结合你禁用OrderBy的需求,有两种直观写法:
写法1:按元素值筛选
先跳过所有小于等于7的元素,再截取所有大于7的元素:
using System; using System.Linq; using System.Collections.Generic; public class Program { public static void Main() { IList<int> numbersList = new List<int>(){ 1, 4, 5, 6, 7, 8, 9, 10, 2, 3 }; var result = numbersList.SkipWhile(x => x <=7).TakeWhile(x => x >7); foreach(var num in result) Console.WriteLine(num); } }
写法2:按索引定位
如果你明确知道目标元素的索引范围,可跳过前5个元素(索引0-4),再取前3个:
var result = numbersList.SkipWhile((x,i) => i <5).Take(3);
两种写法都能输出你想要的8、9、10。
内容的提问来源于stack exchange,提问作者Ronit
相关产品推荐
相关产品推荐

