我有一个IList<Effort>
类型的列表。模型Effort包含一个名为float
的{{1}}。我希望在F#中返回整个列表中Amount
的总和。如何实现这一目标?
答案 0 :(得分:5)
efforts |> Seq.sumBy (fun e -> e.Amount)
答案 1 :(得分:5)
支持Seq.fold
,流水线Seq.fold
和流水线Seq.sumBy
的答案(我最喜欢第三个)。
尽管如此,没有人提到seq<'T>
是IEnumerable<T>
的F#名称,因此Seq
模块功能适用于任何IEnumerable
,包括IList
}第
答案 2 :(得分:4)
Seq.fold (fun acc (effort: Effort) -> acc + effort.Amount) 0.0 efforts
答案 3 :(得分:3)
可能有趣的一个细节是您也可以避免使用类型注释。在 sepp2k 的代码中,您需要指定effort
值的类型为Effort
,因为编译器正在处理从左到右的代码(它会如果它不知道类型,则在effort.Amount
呼叫失败。您可以使用流水线操作符来编写它:
efforts |> Seq.fold (fun acc effort -> acc + effort.Amount) 0.0
现在,编译器知道effort
的类型,因为它知道它正在处理类型为efforts
的集合IList<Effort>
。这是一个小改进,但我认为这很不错。