【问题标题】:LINQ where vs takewhileLINQ where vs takewhile
【发布时间】:2011-02-17 16:33:11
【问题描述】:

我想了解TakeWhileWhere LINQ 方法之间的区别。我从 MSDN 获得了以下数据。但这对我来说没有意义

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

根据谓词过滤一系列值。

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

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

欢迎所有意见。

【问题讨论】:

  • 好问题 - TakeWhile 上的 Intellisense 仍然说“返回元素......只要指定条件为真”。这可以很好地解释为与 Where 相同。措辞应该类似于“返回元素......直到条件评估为假”。

标签: .net linq


【解决方案1】:

TakeWhile在条件为假时停止,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

【讨论】:

  • 拯救我的一天。 Tks
【解决方案2】:

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

【讨论】:

  • 简短而甜蜜,完美的答案
【解决方案3】:

假设您有一个包含[1, 3, 5, 7, 9, 0, 2, 4, 6, 8] 的数组。现在:

var whereTest = array.Where(i =&gt; i &lt;= 5); 将返回 [1, 3, 5, 0, 2, 4]

var whileTest = array.TakeWhile(i =&gt; i &lt;= 5); 将返回 [1, 3, 5]

【讨论】:

  • 我认为 whileTest 只会返回 1 取决于 @David B 和 @Albin Sunnanbo 的答案
  • 不,它会返回项目,直到条件不满足。在这种情况下,1、3 和 5 满足条件(它们是
【解决方案4】:

MSDN 说

Enumerable.TakeWhile Method

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

Enumerable.Where

过滤一系列值 谓词。

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      传递的序列顺序对于TakeWhile 来说是绝对关键的,一旦谓词返回false,它就会终止,而Where 将继续评估第一个false 值之外的序列。

      TakeWhile 的常见用法是在对大型、昂贵甚至无限可枚举进行惰性求值期间,您可能对序列的顺序有更多了解。

      例如给定顺序:

      IEnumerable<BigInteger> InfiniteSequence()
      {
          BigInteger sequence = 0;
          while (true)
          {
              yield return sequence++;
          }
      }
      

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

      var result = InfiniteSequence()
          .Where(n => n < 100)
          .Count();
      

      .TakeWhile 并知道可枚举是升序的,将允许评估部分序列:

      var result = InfiniteSequence()
          .TakeWhile(n => n < 100)
          .Count();
      

      【讨论】:

      • 确实如此。它对于解析一系列标记也非常有用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-05
      • 2013-04-27
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多