LINQ在哪里vs takewhile

Moh*_*bet 96 .net linq

我想在takewhile和LINQ方法之间找到区别.我从MSDN获得了以下数据.但这对我来说没有意义

Where<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>) 
Run Code Online (Sandbox Code Playgroud)

根据谓词过滤一系列值.

TakeWhile<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)
Run Code Online (Sandbox Code Playgroud)

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

欢迎所有意见.

Alb*_*nbo 154

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);
Run Code Online (Sandbox Code Playgroud)

Where
1
2
3
-1
-2
TakeWhile
1
2
3
Run Code Online (Sandbox Code Playgroud)


Amy*_*y B 29

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

Enumerable.Range(1, 10).Where(x => x % 2 == 1)
// 1, 3, 5, 7, 9
Run Code Online (Sandbox Code Playgroud)

TakeWhile 遇到第一次不匹配时停止寻找.

Enumerable.Range(1, 10).TakeWhile(x => x % 2 == 1)
// 1
Run Code Online (Sandbox Code Playgroud)


Jim*_*hel 9

假设您有一个包含的数组[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].


nav*_*een 8

MSDN说

Enumerable.TakeWhile Method

只要指定的条件为true,就返回序列中的元素,然后跳过其余元素.

Enumerable.Where

根据谓词过滤一系列值.

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


jmo*_*eno 7

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


Stu*_*tLC 5

传递的序列的顺序对于绝对是至关重要的TakeWhile,一旦谓词返回false,它将终止,而Where将继续评估超出第一个false值的序列。

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

例如给定顺序:

IEnumerable<BigInteger> InfiniteSequence()
{
    BigInteger sequence = 0;
    while (true)
    {
        yield return sequence++;
    }
}
Run Code Online (Sandbox Code Playgroud)

A .Where将导致无限循环,试图评估可枚举的一部分:

var result = InfiniteSequence()
    .Where(n => n < 100)
    .Count();
Run Code Online (Sandbox Code Playgroud)

鉴于.TakeWhile,并且知道可枚举数正在上升,因此可以评估部分序列:

var result = InfiniteSequence()
    .TakeWhile(n => n < 100)
    .Count();
Run Code Online (Sandbox Code Playgroud)