【问题标题】:F# Summing multiple fields in Seq<'T>F# 对 Seq<'T> 中的多个字段求和
【发布时间】:2018-06-14 21:25:21
【问题描述】:

我希望能够对序列的多个字段求和。如果不多次迭代序列,我不知道如何做到这一点。我的看法是,这是低效的。有没有我看不到的聪明方法?

type item = {
    Name : string
    DemandQty : decimal
    Weight : decimal
    UnitCost : decimal
}

let items =
    {1..10}
    |> Seq.map (fun x -> 
        {
            Name = string x
            DemandQty = decimal x
            Weight = decimal x
            UnitCost = decimal x
        })

// This Works for a single value
let costSum =
    items
    |> Seq.sumBy (fun x -> x.DemandQty * x.UnitCost)

// This is similar to what I would like to do
let costSum, weightSum =
    items
    |> Seq.sumBy (fun x -> x.DemandQty * x.UnitCost, x.DemandQty * x.Weight)

理想情况下,我可以通过在序列上映射来对我正在计算的多个值求和。我的想法在这里吗?

如果我必须多次遍历序列来计算我想要的所有总和,我也会有兴趣了解性能影响。我的看法是这样做效率低下。

【问题讨论】:

    标签: f# seq


    【解决方案1】:

    一种直接求和的方法是用 sum 函数折叠序列:

    let costSum, weightSum =
        items
        |> Seq.fold 
            (fun (costSum, weightSum) x -> (costSum + x.DemandQty * x.UnitCost, weightSum + x.DemandQty * x.Weight)) 
            (0m, 0m)
    

    至于多次迭代序列对性能的影响取决于它。重复序列的迭代工作。因此,从表面上看,它的效率较低。然而,对于较短的序列,当重复迭代次数恒定时,性能影响可能可以忽略不计。计算复杂性理论还指出,当元素数量增加时,常数可以忽略不计。

    简而言之,如果重要,请根据预期输入进行基准测试。如果它没有足够大的影响,请使用提供最佳清晰度的解决方案。

    【讨论】:

    • 这太棒了。我知道必须有一些简单的方法!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多