代码之家  ›  专栏  ›  技术社区  ›  Stefan

这个linq查询是否在for-each循环的每次迭代中运行?

  •  6
  • Stefan  · 技术社区  · 17 年前

    在另一个关于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
    
    3 回复  |  直到 17 年前
        1
  •  7
  •   Timothy Khouri    17 年前

    不……在foreach中,“GetEnumerator”只被调用一次(永远),并且将继续使用。

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

    编辑:请原谅我过于冗长。..但我想 显示 你知道发生了什么事。..所以这里有一个Console应用程序:)

    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";
            }
        }
    }
    

    EDIT:这将产生一个DateTime,然后是abc1,然后是DateTime,接着是abc2,然后是DateTime,然后是abc 3,最后是DateTime。

        2
  •  1
  •   tvanfosson    17 年前

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

        3
  •  0
  •   Stefan    17 年前

    我逐一查找了。..NEXT语句,看起来Visual Basic在循环开始之前只对集合求值一次,所以它不应该在每次迭代时都运行查询。

    迭代次数。Visual Basic语言 仅对集合进行一次评估, 在循环开始之前。如果你 语句块更改元素或 组,这些更改不会影响 循环的迭代。

    推荐文章