在C# LINQ中,我們可以用let子句來使用一個臨時變數:
var users2 = from user in users
let total = users.Sum(u => u.Salary)
let avg = total / n
where user.Salary > avg
選擇用戶。
是否可以在F#中一次性完成同樣的作業?
let avg = users |> List.averageBy (span class="hljs-keyword">fun user -> float user.Salary)
let users2 = users |> List.filter (span class="hljs-keyword">fun user -> user.Salary > int avg)
我只能在兩個不同的操作中做到這一點。
uj5u.com熱心網友回復:
首先,我認為你的F#解決方案非常合理,我不認為它需要任何改進。此外,你還想在前期只計算一次avg--C#代碼很可能為它所查詢的每個用戶重新計算(所以你的C#代碼如果在查詢前計算avg會更好!)
C#的查詢理解能力很強。
C#的查詢理解大致相當于下面的F#序列運算式:
C#的查詢理解大致相當于下面的F#序列運算式。
let users2 =
[for u in users do
讓avg = users |> List.averageBy (span class="hljs-keyword">fun user -> float user.Salary)
if u.Salary > int avg then yield u ] 。
這是在for回圈中(或在from子句中)計算avg,因此這是為你正在迭代的每個用戶重新計算的。你可以通過將avg移到for之前來改善這個問題:
let users2 =
[ let avg = users |> List.averageBy (span class="hljs-keyword">fun user -> float user.Salary)
for u in users do
if u.Salary > int avg then yield u ] 。
這在一次理解中完成了所有的處理,并且沒有重新計算avg,所以我認為這已經是最好的了。無論你是喜歡這個還是明確使用高階函式,都是個人的選擇 - 我認為你的版本可能比這個更簡單。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/310085.html
標籤:
上一篇:使用EntityFrameworkLINQ查詢帶有表計數的SQL聯合體
下一篇:Linq查詢不能選擇欄位串列
