用ToArray()
等方法強制評估LINQ查詢的做法是否被接受,並且是否存在用於組成最佳查詢鏈的一般啓發式方法?我經常嘗試一次性完成所有事情,因爲我注意到在這些情況下,AsParallel()
在加速計算方面確實做得很好。在查詢執行沒有副作用的計算的情況下,但是需要多次通過才能獲得正確的數據,這就迫使使用ToArray()
的計算是正確的方式還是更好地將查詢保留爲惰性格式?何時強制LINQ查詢評估?
3
A
回答
2
將查詢保留在惰性表單中,直到您開始多次評估查詢,或者甚至更早,如果您需要它們以另一種形式或您正處於變量值捕獲的變量中。
如果查詢包含要避免多次執行的複雜投影(例如,爲包含大量元素的序列構建複雜對象),您可能需要評估。在這種情況下,評估一次並迭代多次會更加安全。
如果您想要將結果返回給另一個需要特定類型的集合的API,則可能需要另一種形式的結果。
如果查詢捕獲的變量不在本地範圍內,您可能想要或需要阻止訪問修改後的關閉。在實際評估查詢之前,您有可能在其他代碼的「背後」更改其值;當評估發生時,它將使用這些值而不是構建查詢時出現的值。 (但是,可以通過在另一個具有本地作用域的變量中複製這些值來解決此問題)。
1
當您需要使用數組時,您通常只會使用ToArray()
,就像使用期望數組的API一樣。只要你不需要訪問查詢的結果,並且你不侷限於某種連接上下文(就像LINQ to SQL或LINQ to Entities的情況那樣),那麼你可能只是以惰性形式保留查詢。
2
如果您不反對使用「實驗」庫,則可以使用Interactive Extensions庫中的EnumerableEx.Memoize
擴展方法。
該方法提供了一種兩全其美的選項,其中底層序列是按需計算的,但不是在次要遍次上重新計算。在我看來,另一個小好處是,退貨類型不是可變收集,因爲它將與ToArray
或ToList
一起使用。
相關問題
- 1. 無法強制執行LINQ評估
- 2. 如何強制LINQ to SQL來評估數據庫中的整個查詢?
- 3. 是否可以強制查詢集評估,同時保留查詢集
- 4. PHP - 強制功能評估?
- 5. 強制iframe評估其javascript?
- 6. 評估在查詢
- 7. 在評估LINQ查詢時確定進度
- 8. LINQ查詢在調試時在線評估
- 9. LINQ如何強制查詢實現?
- 10. 讓let子句並行linq強制並行評估?
- 11. constexpr靜態成員的強制評估
- 12. 強制反應塊進行評估
- 13. 強制JavaScript重新評估信號?
- 14. 強制對惰性IO進行評估
- 15. 強制ggplot評估計數器變量
- 16. 如何評估/解釋sphinxql查詢?
- 17. 編譯器無法評估LINQ查詢中的類型參數
- 18. 爲什麼2個LINQ查詢得到評估不同
- 19. LINQ,「值不能爲空」,但查詢評估
- 20. 在存儲在會話中之前強制評估匿名類型查詢
- 21. MySQL查詢檢查用戶評估
- 22. 何時評估塊?
- 23. 是LINQ懶惰評估?
- 24. Powershell:在替換時強制立即評估反向引用
- 25. 函數調用時強制進行默認重新評估
- 26. 如何評估GPS信號強度? (iPhone)
- 27. 如何評估Sql中的Firstordefault Linq?
- 28. phpmysql查詢腫瘤學評估工具
- 29. 重新評估模型級查詢
- 30. 提供評估另一個查詢
調用'Count()'作爲訪問查詢的結果嗎? – svick
這取決於實現 - 它可能迭代每個結果來計算每個結果,或者可能會在SELECT COUNT ... SQL語句中進行優化。 –
使用LINQ to Entities和LINQ to SQL,Count()將懶惰地評估。你可以調用ToList(),Count()或ToArray()。Count()來獲得直接結果。請參閱http://msdn.microsoft.com/en-us/library/bb308959.aspx –