2009-05-05 35 views
3

看看下面的例子总和,所有项目的特定属性的列表

我有一个类

public class SomeItem 
{ 
    public string Name; 
    public DateTime Published; 
    public uint16 Size; 
} 

我有一个List<SomeItem>,我想计算的全部总规模项目。
在C#我想简单地写

var totalSize = items.Sum((i) => i.Size); 

我已经采取了看看在F#列表的功能,但他们总是抱怨的类型。

你会如何在F#中编写它?

(我已经尝试了搜索引擎,但F#的搜索引擎支持是可怕的)

回答

8

假设你有IEnumerable<Item>类型的值,可以使用sum_bySeq模块:

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

这在F#和其他函数式语言“折叠”。 寻找Seq.fold的例子。

+0

其他人建议Seq.sum_by, 我很感兴趣,为什么你认为Seq.fold – TimothyP 2009-05-05 14:28:14

+0

@TimothyP:Seq.fold会做的工作,只是它的宗旨是比sum_by更通用的(可以多所有的值例如,一个列表)。在这种情况下,sum_by是很好的简单解决方案。 – Noldorin 2009-05-05 14:38:32

+0

同意。但是,如果您正在查找描述“按顺序对所有项目执行操作并提供单一结果”的搜索术语,那么搜索折叠/折叠将为您提供一般解决方案。 – 2009-05-05 16:22:49

2
let totalSize = items |> List.sum_by (fun i -> i.Size) 

LINQ在F#工作也没关系,但它可能是最好使用列表理解像上面,因为它更在功能的传统(因为它不使用IEnumerable<T>也稍快执行)。

相关问题