[英]LINQ query reuse and deferred execution
我的印象是,我可以創建一個LINQ查詢,然后在更改涉及的參數的同時重用它。 但似乎您無法更改源集合。 有人可以給我一個很好的解釋,為什么,因為我顯然誤解了一些基本知識。
這是一些示例代碼。
var source = Enumerable.Range(1, 10);
var value = source.Where(x => x > 5);
var first = value.ToArray();
source = Enumerable.Range(11, 20);
var second = value.ToArray();
我期望第一是6,7,8,9,10,第二是11至20。
當您這樣做時:
source = Enumerable.Range(11, 20);
您正在創建一個新對象。 但是, Where
查詢仍然具有對舊對象的引用。
source = Enumerable.Range(11, 20);
var second = value.ToArray();
second = Enumerable.Range(11, 20);
var second = value.ToArray();
找到一個不同;)
因為value = source.Where(x => x > 5)
急切地評估source
的值,但會推遲x => x > 5
部分的評估。 當您重新分配來源時,原始范圍仍然存在,來源只是指向另一個范圍。 簡而言之,lambda內部的值是惰性計算的。
延遲執行的示例
source = Enumerable.Range(1,10).ToArray();
value = source.Where(x => x > 5);
var first = value.ToArray(); // 6,7,8,9,10
source.[0] = 100;
var second = value.ToArray(); // 100,6,7,8,9,10
懶惰地訪問源代碼的示例 (我不建議使用這種類型的代碼,這是一個如何在lambda中訪問source
變量的示例,該示例創建了一個“閉包”來延遲對source
的訪問
source = Enumerable.Range(1,10);
value = Enumerable.Range(1).SelectMany(n => source.Where(x => x > 5));
var first = value.ToArray();
source = Enumerable.Range(11,20);
var second = value.ToArray();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.