采取以下示例,
我有一个班级
public class SomeItem
{
public string Name;
public DateTime Published;
public uint16 Size;
}
我有一个List<SomeItem>
,我想计算所有项目的总大小
在C#中我只想写
var totalSize = items.Sum((i) => i.Size);
我已经看过F#中的List函数,但是他们总是抱怨类型。
你会如何用F#写这个?
(我已尝试过搜索引擎,但F#的搜索引擎支持非常糟糕)
答案 0 :(得分:8)
假设您的值为IEnumerable<Item>
,则可以使用sum_by
模块中的Seq
:
let totalSize = items |> Seq.sum_by (fun (i : Item) -> i.Size)
请注意,F#的Microsoft.FSharp.Collections.List<T>
类型与System.Collections.Generic.List<T>
中可能使用的类不同,并且它们不是可交互的。但是,Seq
模块中的方法适用于任何IEnumerable<T>
,而IEnumerable<T>
在F#和C#之间是相同的。
答案 1 :(得分:2)
let totalSize = items |> List.sum_by (fun i -> i.Size)
LINQ在F#中也可以正常工作,但最好使用上面的列表理解,因为它在功能传统中更多(并且由于它不使用IEnumerable<T>
而执行得稍快一些)。
答案 2 :(得分:1)
这是F#和其他功能语言中的“折叠”。 寻找Seq.fold的例子。