我有以下代码(在一个更大的函数中,但这不重要):
let ordersForTask = Dictionary<_, _>()
let getOrdersForTask task =
match ordersForTask.TryGetValue task with
| true, orders -> orders
| false, _ ->
let orders =
scenario.Orders
|> Seq.filter (fun (order : Order) -> order.Tasks.Contains(task))
|> Seq.cache
ordersForTask.Add(task, orders)
orders
根据我的理解,无论order.Tasks.Contains()
调用order
多少次,都应该为每对task
和getOrdersForTask
值调用一次task
相同的n
值,因为输入序列仅迭代(最多)一次。但是,情况似乎并非如此;如果我为task
的所有值调用函数n * number of orders * number of tasks
次,则分析会显示对Contains()
的{{1}}次调用。
用Seq.cache
替换Seq.toList
会产生我预期的效果,但我希望避免承担Seq.toList
的费用。
我对Seq.cache
或使用中的错误有什么误解?