簡體   English   中英

LINQ查詢重用和延遲執行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM