skipWhile在LINQ中不起作用

时间:2016-08-17 00:33:58

标签: c# linq

我正在尝试学习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

任何人都可以指出我在这方面做错了什么,以及如何获得预期的结果。

4 个答案:

答案 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