LINQ在哪里vs takewhile

时间:2011-02-17 16:33:12

标签: .net linq

我希望在takewhile&和LINQ方法。我从MSDN获得了以下数据。但这对我来说没有意义

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

根据谓词过滤一系列值。

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

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

欢迎所有意见。

6 个答案:

答案 0 :(得分:146)

TakeWhile在条件为false时停止,Where继续并找到符合条件的所有元素

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

答案 1 :(得分:27)

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

答案 2 :(得分: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]

答案 3 :(得分:7)

MSDN说

Enumerable.TakeWhile Method

  

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

Enumerable.Where

  

根据以下内容过滤一系列值   谓词。

区别在于Enumerable.TakeWhile 会跳过第一个不匹配的剩余元素,无论它们是否符合条件

答案 4 :(得分:6)

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

答案 5 :(得分:4)

传递的序列的顺序对于TakeWhile绝对至关重要,一旦谓词返回false,它将立即终止,而Where将继续评估第一个{之后的序列{ {1}}值。

false的一个常见用法是在对大型,昂贵甚至无限的可用数据进行惰性求值期间,您可能对序列的顺序有了额外的了解。

e.g。鉴于顺序:

TakeWhile

IEnumerable<BigInteger> InfiniteSequence() { BigInteger sequence = 0; while (true) { yield return sequence++; } } 将导致无限循环尝试评估可枚举部分:

.Where

var result = InfiniteSequence() .Where(n => n < 100) .Count(); ,并且知道可枚举物正在升序,将允许评估部分序列:

.TakeWhile