LINQ在哪里与需要

我想得到一个区别之间的时间和LINQ的方法。我从MSDN获得以下数据。但它对我没有意义

Where<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>) 

根据谓词过滤一系列值。

 TakeWhile<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>) 

只要指定的条件为真,就返回序列中的元素。

所有意见都欢迎。

TakeWhile在条件为false时停止,在那里继续并查找与条件匹配的所有元素

 var intList = new int[] { 1, 2, 3, 4, 5, -1, -2 }; Console.WriteLine("Where"); foreach (var i in intList.Where(x => x <= 3)) Console.WriteLine(i); Console.WriteLine("TakeWhile"); foreach (var i in intList.TakeWhile(x => x <= 3)) Console.WriteLine(i); 

 Where 1 2 3 -1 -2 TakeWhile 1 2 3 

Where可以检查整个序列寻找匹配。

 Enumerable.Range(1, 10).Where(x => x % 2 == 1) // 1, 3, 5, 7, 9 

TakeWhile在遇到第一个不匹配时停止查找。

 Enumerable.Range(1, 10).TakeWhile(x => x % 2 == 1) // 1 

MSDN说

Enumerable.TakeWhile Method

只要指定的条件为真,就返回序列中的元素,然后跳过剩余的元素。

Enumerable.Where

根据谓词过滤一系列值。

不同之处在于Enumerable.TakeWhile 跳过第一个不匹配的剩余元素是否符合条件

假设你有一个包含[1, 3, 5, 7, 9, 0, 2, 4, 6, 8] 1,3,5,7,9,0,2,4,6,8]的数组。 现在:

var whereTest = array.Where(i => i <= 5); 将返回[1, 3, 5, 0, 2, 4]

var whileTest = array.TakeWhile(i => i <= 5); 将返回[1, 3, 5]

传递序列的顺序对于TakeWhile来说绝对是关键的,一旦谓词返回false ,就会终止,而Where将继续评估超出第一个false值的序列。

TakeWhile一个常见用法是懒惰评估大型,昂贵甚至无限的枚举types,您可能对序列的顺序有更多的了解。

例如给定序列:

 IEnumerable<BigInteger> InfiniteSequence() { BigInteger sequence = 0; while (true) { yield return sequence++; } } 

A。在.Where将导致一个无限循环尝试评估部分可枚举:

 var result = InfiniteSequence() .Where(n => n < 100) .Count(); 

然而,当.TakeWhile枚举数上升的知识武装起来的时候,将允许对部分序列进行评估:

 var result = InfiniteSequence() .TakeWhile(n => n < 100) .Count(); 

虽然现有的答案是正确的,但是他们没有一个指出为什么你想要使用TakeWhile,如果结果是相同的:性能。 假设你有一个有20亿个项目的有序列表,你想要那些(可能10或15个项目)less于给定的值。 Where子句将检查所有20亿个项目,而TakeWhile将在发现等于或大于您提供的值的值时立即停止