スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

F#によるLinq to Obj入門 (6) Aggregate sum等

Aggregateはfold,reduceに対応するものです。
 
引数としては、seed(stateの種、初期値)、関数となります。
 
> Seq.fold (fun accu x -> accu + x) 0 (seq[3;2;1;0;-1]);;
val it : int = 5
 
はAggregateを使うと
 
> seq[3;2;1;0;-1].Aggregate(0,(fun accu t -> accu + t)) ;;
val it : int = 5
 
というようになります。
 
第一引数のseedを省略すると、シークエンスの最初の値がseedとなります。
つまりSeq.reduceと同様の処理となります。
 

> seq[3;2;1;0;-1].Aggregate((fun accu t -> accu + t))  ;;
val it : int = 5
 
Aggregateを使ってシークエンス内の偶数と奇数の個数をタプルで返すようにしてみます。
 
> seq[3;2;1;0;-1].Aggregate((0,0),(fun (c1,c2) t -> 
                                        if t % 2 = 0 then (c1+1,c2) else (c1,c2+1)));;
val it : int * int = (2, 3)
 
Aggregateを使ってシークエンス内の要素の個数を調べてみます。
 
> seq[3;2;1;0;-1].Aggregate(0,(fun s _ -> s+1 ));;
val it : int = 5
 
要素の個数を調べるものとしてはメソッドCountも準備されています。
 
> seq[3;2;1;0;-1].Count();;
val it : int = 5
 
こちらはオーバーロードされていて、関数を一緒に引数にして渡すと、この関数に値を適用したものが真となるものの個数を返します。
 
例えば偶数であるものの個数は次の様になります。
 
> seq[3;2;1;0;-1].Count(fun x -> x % 2 = 0);;
val it : int = 2
 
次の様にしても同じです。
 
> seq[3;2;1;0;-1].Where(fun x -> x % 2 = 0).Count();;
val it : int = 2
 
和、最大値、最小値、平均についてもメソッドが準備されています。
 
> seq[3;2;1;0;-1].Sum();;
val it : int = 5
 
> seq[3;2;1;0;-1].Max();;
val it : int = 3
 
> seq[3;2;1;0;-1].Min();;
val it : int = -1
 
> seq[1;1;1;1;0].Average();;
val it : float = 0.8
 
Averageでseq<int>,seq<long>型が対象の場合は結果はdouble型になります。
 
例えばMaxをAggregateで表現すると次の様になります。
 
> seq[3;2;6;0;-1].Aggregate((fun s t -> if t > s then t else s ));;
val it : int = 6
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。