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

当您使用调试器查看变量时,Visual Studio 正在执行迭代器。这就是你看到结果的原因。

出于同样的原因,您不应将i++其放入监视窗口,因为代码实际上已被执行。

于 2012-09-28T07:16:54.993 回答
0

因为您的调试器正在为您执行查询。

Linq 正在使用一种称为延迟执行的东西。这是一篇很好的博客文章来解释它: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 回答