0

このリンクに従って:http://msdn.microsoft.com/en-us/library/bb397906.aspx

namespace Linq
{
    class IntroToLINQ
    {
        static void Main()
        {
            // The Three Parts of a LINQ Query: 
            //  1. Data source. 
            int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };

            // 2. Query creation. 
            // numQuery is an IEnumerable<int> 
            var numQuery =
                from num in numbers
                where (num % 2) == 0
                select num;

            // 3. Query execution. 
            foreach (int num in numQuery)
            {
                Console.Write("{0,1} ", num);
            }
        }
    }

}

データが foreach を介して繰り返されるまで、クエリは実行されないと述べています。しかし、デバッグすると、var(resultviews) のデータ メンバには、foreach の実行前の結果の値が含まれています。なぜこれが起こっているのですか?

4

2 に答える 2

0

デバッガーがクエリを実行しているためです。

Linq は Deferred Execution と呼ばれるものを使用しています。これを説明する良いブログ投稿があります: LINQ and Deferred Execution

イテレータを最初に実行すると、クエリが処理されて実行されます (メモリ内、データベース、または別の方法で)。デバッガーがこれを行います。

たとえば、次のコードを見てください (これをコンソール アプリケーションに貼り付けることができます)。

using System;
using System.Diagnostics;
using System.Linq;

namespace Stackoverflow
{
    class Program
    {
        static void Main()
        {
            var numbers = Enumerable.Range(0, 100).ToList();

            var filteredNumbers = from n in numbers
                                  where n > 50
                                  select n;

            Debugger.Break();

            foreach(int f in filteredNumbers)
            {
                Console.WriteLine(f);
            }

        }
    }
}

filteredNumbersDebugger.Break() ステートメントを見ると、次のように表示されます。

Linq Enumerable のデバッグ ビュー

結果ビューのオプションには、「結果ビューを展開すると IEnumerable が列挙されます」という値があります。そして、それがデバッガーで起こっていることです。

于 2012-09-28T07:18:56.270 に答える
0

デバッガーで変数を見ると、Visual Studio は反復子を実行しています。だからこそ、結果を見るのです。

i++コードが実際に実行されるため、ウォッチ ウィンドウに入れるべきではないのと同じ理由です。

于 2012-09-28T07:16:54.993 に答える