6

SO に関する別の質問では、以下のようなコードで回答し、おそらく for/each のすべての反復で LINQ クエリが評価されるというコメントを得ました。本当?

項目が評価される前に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
4

3 に答える 3

7

いいえ... foreachでは、「GetEnumerator」は1回だけ(これまでに)呼び出され、それが今後使用されます。

編集:結果セットが一時的に保存されていることについてここにステートメントを入れました...これは一部のケースにのみ当てはまります...これはそうではないので、取り出しました。

編集:過度に冗長であることをお許しください...しかし、何が起こっているのかをお見せしたかったので...ここにコンソールアプリがあります:)

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 が生成されます。

于 2008-12-02T03:06:08.350 に答える
1

最初に到達したときに実行され、一致するすべての値を持つ列挙が生成されると思います。実際に返されるのは、その列挙の列挙子です。

于 2008-12-02T02:46:17.923 に答える
0

FOR EACH...NEXT ステートメントを調べたところ、ループが始まる前に Visual Basic がコレクションを 1 回だけ評価するように見えるため、反復ごとにクエリを実行する必要はありません。

反復回数。Visual Basic は、ループが始まる前に、コレクションを 1 回だけ評価します。ステートメント ブロックで要素またはグループが変更された場合、これらの変更はループの繰り返しには影響しません。

于 2008-12-02T02:44:13.387 に答える