2009-05-05 73 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>也稍快執行)。

相關問題