2011-11-03 120 views
0

情形1執行流程

var numbers = new List<int>(); 
numbers.Add (1); 
IEnumerable<int> query = numbers.Select (n => n * 10); // Build query 
numbers.Add (2); 

//Use or execute query 

情形2

var numbers = new List<int>() { 1, 2 }; 
numbers.Add(4); 
List<int> query = numbers 
    .Select (n => n * 10) 
    .ToList();      // Executes immediately into a List<int> 
numbers.Add(3); 
numbers.Clear(); 

//Use or execute query 

爲什麼在第一種情況下查詢包含1,2-

在第二種情況下查詢僅包含1,2, 4但不是3,是因爲我們正在調用.ToList()方法。

回答

5

這是因爲,直到你開始列舉在結果集不執行查詢(通過調用.ToArray(),.ToList(),或者乾脆寫一個foreach)

IEnumerable<int> query = numbers.Select (n => n * 10); 

不執行任何。這是LINQ的懶惰本質。

+0

如果你在select中的代碼上放置一個斷點,你可以看到這個。只有在查詢被枚舉後它纔會中斷。 –

1

任何返回IEnumerable<T>的Linq方法都是延遲的,這意味着它將在枚舉之前不返回項目。

ToList<T>()是一個非延期操作。

0

case1查詢在您枚舉它之後執行。

case2的結果不包含3因爲你已經執行的查詢並保持它的結果(這是一個IEnumarable對象)在query變量(這不是一個Linq Query對象。)

0

LINQ用途遲執行的概念意味着它只會在它要求實際工作時才執行查詢,如.first .list等。

0

只有在.tolist()將調用時,linq纔會調用數據庫並返回實際數據。

+0

這裏沒有數據庫。 – Richard