我有一个类型为
IList<Effort>
的列表。模型Effort包含名为Amount
的float
。我想以F#返回整个列表的Amount
总和。如何实现呢?efforts |> Seq.sumBy (fun e -> e.Amount)
我已经点赞了Seq.fold
、管道化的Seq.fold
和管道化的Seq.sumBy
(我最喜欢第三个)。
话虽如此,没有人提到seq<'T>
是F#中IEnumerable<T>
的名称,因此Seq
模块函数适用于任何IEnumerable
,包括IList
。
Seq.fold (fun acc (effort: Effort) -> acc + effort.Amount) 0.0 efforts
一个有趣的细节是,您也可以避免使用类型注释。在sepp2k的代码中,您需要指定effort
值具有类型Effort
,因为编译器正在从左到右处理代码(如果不知道类型,则会在调用effort.Amount
时失败)。您可以使用管道运算符来编写此代码:
efforts |> Seq.fold (fun acc effort -> acc + effort.Amount) 0.0
effort
的类型,因为它知道正在处理类型为IList<Effort>
的集合efforts
。这是一个小改进,但我认为很不错。