我希望在takewhile&和LINQ方法。我从MSDN获得了以下数据。但这对我来说没有意义
Where<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)
根据谓词过滤一系列值。
TakeWhile<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)
只要指定的条件为true,就返回序列中的元素。
欢迎所有意见。
答案 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)
将序列中的元素返回为 只要指定的条件为真, 然后跳过剩下的元素。
根据以下内容过滤一系列值 谓词。
区别在于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