我正在尝试学习LINQ,并从MSD文档中发现只要语句为真,SkipWhile
将倾向于跳过该值。但是当我在下面使用这个陈述时,我没有按预期得到结果。
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
var allButFirst3Numbers = numbers.SkipWhile(x => x > 9);
foreach (var n in allButFirst3Numbers)
{
Console.WriteLine(n);
}
从上面的代码中结果应该是
1,2,3,4,5,6,7,8,9
但我得到的结果是
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
任何人都可以指出我在这方面做错了什么,以及如何获得预期的结果。
答案 0 :(得分:4)
来自Enumerable.SkipWhile的文件(强调我的):
此方法使用谓词测试源的每个元素,如果结果为true,则跳过元素。 谓词函数为元素返回false后,将生成该元素和源中的其余元素,并且不再有谓词调用。
因为第一个元素产生false
,它将返回所有内容。我怀疑你真正想写的是:
var result = numbers.Where(x => x <= 9);
答案 1 :(得分:1)
你得到了你应该得到的东西。你说的是跳过x&gt; 9. 1小于9,所以它立即开始。
尝试.SkipWhile(x=>x<=9)
...但那会给你10,11,12,13,......
您也可以尝试.TakeWhile(x=>x<=9)
,它将返回1,2,3,4,5,6,7,8,9
答案 2 :(得分:0)
所述谓词x => x > 9
将在列表的开头匹配,一旦该谓词为false
,它将继续并考虑所有元素。您应该尝试使用Where()
扩展方法,例如
var allButFirst3Numbers = numbers.Where(x => x > 9);
答案 3 :(得分:0)
然后你想要,而不是跳过
var numbers = Enumerable.Range(1, 15);
var result = numbers.TakeWhile(x => x <= 9);
Debug.Print(string.Join(", ", result)); // 1, 2, 3, 4, 5, 6, 7, 8, 9