Выполняется ли этот запрос linq на каждой итерации цикла for-each?

в другом вопросе на SO я ответил кодом, подобным приведенному ниже, и получил комментарий, что LINQ-запрос, вероятно, был оценен в каждой итерации for/each. Это правда?

Я знаю, что LINQ-querys не выполняется до оценки его элементов, поэтому кажется возможным, что этот способ итерации результата может заставить его работать на каждой итерации?

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 ответов


нет... в foreach "GetEnumerator" вызывается только один раз (когда-либо), и это используется в дальнейшем.

EDIT: я помещаю здесь Заявление о временном хранении результирующего набора... это верно только для некоторых случаев... не этот, поэтому я его вытащил.

EDIT: пожалуйста, простите это за излишнюю многословность... но я хотел ... --6-->показать тебе, что происходит... Итак, вот консольное приложение:)

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, затем abc3, затем DateTime.


Я считаю, что он будет работать при первом достижении и производить перечисление, которое имеет все соответствующие значения. На самом деле вы получите перечислитель для этого перечисления.


Я посмотрел вверх для каждого...Оператор NEXT и похоже, что Visual Basic оценивает коллекцию только один раз, до начала цикла, поэтому он не должен запускать запрос на каждой итерации.

число итераций. язык Visual Basic оценивает коллекцию только один раз, до начала цикла. Если ваш блок инструкции изменяет элемент или группы, эти изменения не влияют на итерация цикла.