我想知道Takewhile和LINQ方法之间的区别。我从MSDN获得了以下数据。但是对我来说这没有意义
Where<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)
根据谓词过滤值序列。
TakeWhile<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)
只要指定条件为真,就从序列中返回元素。
欢迎所有意见。
我想知道Takewhile和LINQ方法之间的区别。我从MSDN获得了以下数据。但是对我来说这没有意义
Where<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)
根据谓词过滤值序列。
TakeWhile<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)
只要指定条件为真,就从序列中返回元素。
欢迎所有意见。
Answers:
当条件为假时,TakeWhile停止;在条件继续的地方继续查找所有与条件匹配的元素
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, 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
,它将在谓词返回后立即终止false
,而Where
将继续评估超出第一个false
值的序列。
常见的用法TakeWhile
是在对大型,昂贵甚至无限枚举的惰性计算期间,您可能对序列的排序有更多的了解。
例如给定顺序:
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();