我想在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)
假设您有一个包含的数组[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].
MSDN说
只要指定的条件为true,就返回序列中的元素,然后跳过其余元素.
根据谓词过滤一系列值.
区别在于Enumerable.TakeWhile 跳过第一个不匹配的剩余元素,无论它们是否与条件匹配
虽然现有答案是正确的,但没有一个指出为什么你想要使用TakeWhile,如果结果是相同的:性能.假设您有一个包含20亿个项目的有序列表,并且您希望那些(可能是10或15个项目)小于给定的值.Where子句将检查所有20亿个项目,而TakeWhile会在找到等于或大于您提供的值的值时立即停止
传递的序列的顺序对于绝对是至关重要的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)
| 归档时间: |
|
| 查看次数: |
34190 次 |
| 最近记录: |