2013-09-25 70 views
2

我有以下代码:任何人都可以让我知道为什么它发生在LINQ?

List<int> nums = new List<int>(); 
nums.Add(1); 
nums.Add(4); 
nums.Add(2); 
var lowNums = from n in nums 
       where n%2==0 
       select n; 

Console.WriteLine("Even Numbers before adding 20 :"); 
foreach (var x in lowNums) 
{ 
    Console.WriteLine(x); 
} 

nums.Add(20); 
Console.WriteLine("Even Numbers after adding 20:"); 
foreach (var x in lowNums) 
{ 
    Console.WriteLine(x); 
} 

这里同时运行此,它给了我这样的输出:

enter image description here

但我不知道为什么它显示20,因为我添加20后没有运行LINQ表达式。我只是显示以前计算的结果。任何人都可以解释吗?当你遍历lowNums使用foreach

LINQ查询提供延迟执行和他们没有自己的背衬结构来存储元素

+1

运行一个LINQ查询返回一个枚举; 'foreach'遍历它。该枚举保持对其输入的引用,并在您使用它时生成输出;一个'foreach'循环每次都会创建一个新的枚举器。 – Ryan

+1

Linq查询在声明时并未实际执行。当你请求输出时,它会被执行,这就是你用'foreach'循环所做的。您的Linq查询会执行两次,换句话说,每个'foreach'都会执行一次。 –

回答

2

您不是运行 LINQ表达式,您正在创建它。表达式在需要时被执行,通常被称为延期执行

当您进入该代码时,您会看到lowNums实际上是System.Linq.Enumerable.WhereListIterator<int>这是一个表达式,而不是结果。

通过遍历表达式重新计算结果。如果要明确执行表达式并将结果存储在表达式上,请使用.ToList()

+0

编辑:我是一个白痴。我重新读了实际的问题。 *拍击*。 –

+0

@SimonWhitehead没关系,不需要拍掌;) – Gigo

2

LINQ查询进行评估..

这就像一个传送带上滚动元素只根据需要 ..

+0

感谢大家。这是因为我从上面的答案中得到延期执行。它真的帮助了我。 http://stackoverflow.com/questions/7324033/what-are-the-benefits-of-a-deferred-execution-in-linq也有助于理解这个概念 – Prasanna

相关问题