列表中所有项目的特定属性的总和

时间:2009-05-05 13:49:38

标签: f#

采取以下示例,

我有一个班级

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#的搜索引擎支持非常糟糕)

3 个答案:

答案 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的例子。