【问题标题】:Does this linq query run on every iteration of the for-each loop?这个 linq 查询是否在 for-each 循环的每次迭代中运行?
【发布时间】:2008-12-02 02:34:45
【问题描述】:

在关于 SO 的另一个问题中,我回答了如下代码,并得到评论说 LINQ 查询可能在 for/each 的每次迭代中都进行了评估。这是真的吗?

我知道 LINQ 查询在其项目被评估之前不会执行,所以这种迭代结果的方式似乎可以让它在每次迭代时运行?

Dim d = New Dictionary(Of String, String)()    
d.Add("Teststring", "Hello")    
d.Add("1TestString1", "World")    
d.Add("2TestString2", "Test")    

For Each i As String In From e In d Where e.Value.StartsWith("W") Select e.Key
    MsgBox("This key has a matching value:" & i)    
Next

【问题讨论】:

  • 嗯,看起来你所拥有的还可以,但至少要使用行尾的格式 _ 所以它不在一个大行上 :)
  • 是的。使用 LINQ 进行后期评估需要一段时间才能熟悉。
  • 是的。但是一旦你得到它就很棒,你可以做一些非常甜蜜的事情。
  • 虽然有些案例的评估还不算太晚...例如,在下面的示例中添加“order by”:)

标签: linq enumeration


【解决方案1】:

不...在 foreach 中,“GetEnumerator”仅被调用一次(永远),并且会继续使用。

编辑:我在这里发表了关于临时存储结果集的声明……这仅适用于某些情况……不是这个,所以我把它拿出来了。

编辑:请原谅这过于冗长...但我想向您展示正在发生的事情...所以这是一个控制台应用程序:)

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            foreach (string item in MyCustomEnumerator()
                .Where(item => item.StartsWith("abc")))
            {
            Console.WriteLine(item);
            }
        }

        static IEnumerable<string> MyCustomEnumerator()
        {
            Console.WriteLine(DateTime.Now);

            yield return "abc1";

            Console.WriteLine(DateTime.Now);

            yield return "abc2";

            Console.WriteLine(DateTime.Now);

            yield return "abc3";

            Console.WriteLine(DateTime.Now);

            yield return "xxx";
        }
    }
}

编辑:这将产生一个 DateTime,然后是 abc1,然后是 DateTime,然后是 abc2,然后是 DateTime,然后是 abc3,然后是 DateTime。

【讨论】:

  • 谢谢。和唷。在最近的一个项目中,我经常使用这种方式来迭代 LINQ 结果。 ;)
【解决方案2】:

我相信它会在第一次到达时运行并生成一个包含所有匹配值的枚举。您实际上将得到的是该枚举的枚举器。

【讨论】:

    【解决方案3】:

    我查看了 FOR EACH...NEXT 语句,似乎 Visual Basic 在循环开始之前只对集合求值一次,因此它不应该在每次迭代时都运行查询。

    迭代次数。视觉基础 只评估一次集合, 在循环开始之前。如果你的 语句块更改元素或 组,这些变化不影响 循环的迭代。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-21
      • 2018-02-13
      相关资源
      最近更新 更多