2009-07-08 82 views
1

假設我們有這樣的代碼:Linq緩存多個Froms的結果嗎?

IEnumerable<Foo> A = meh(); 
IEnumerable<Foo> B = meh(); 

var x = 
    from a in A 
    from b in B 
    select new {a, b}; 

讓我們也假設meh返回IEnumerable當遍歷執行了很多昂貴的計算。當然,我們可以簡單地手動藉助於緩存的計算結果

IEnumerable<Foo> A = meh().ToList(); 

我的問題是,如果需要A和B的這種手動緩存,或者如果上述查詢緩存A的執行期間的結果和B本身,所以每一行只能計算一次。 2 * n和n * n計算的區別可能很大,我沒有找到MSDN中行爲的描述,這就是爲什麼我要問。

回答

4

假設你的意思是LINQ到對象,絕對沒有做任何緩存 - 也不應該,IMO。如果你看到我的意思,你正在構建一個查詢,而不是查詢的結果。除此之外,您可能需要遍歷一個大於合理保存在內存中的序列(例如遍歷多千兆字節日誌文件中的每一行)。我當然不希望LINQ嘗試爲我緩存!

如果您想查詢來進行評估,並緩衝供以後快速訪問,調用ToList()可能是你最好的辦法。

請注意,它將完全有效的B到取決於在A上,這是另一個不緩存的原因。例如:

var query = from file in Directory.GetFiles("*.log") 
      from line in new LineReader(file) 
      ...; 

你真的不想LINQ緩存讀取第一日誌文件中的結果,並使用相同的結果日誌文件。我認爲編譯器可能會注意到第二個子句不依賴於第一個子句的範圍變量 - 但它仍然可能依賴於某些副作用或其他因素。

+0

這實際上很有意義。 – mafu 2009-07-08 09:38:48