スポンサーサイト

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

F#によるLinq to Obj入門 (2) Where OrderBy ThenBy ThenByDescending

まずはいつもどおり
> open System
open System.Collections.Generic
open System.Linq;;
としておきます。
 
(1)Where
 
WhereはLinq版のfilterです。
 
> ([2;5;-1;6;3;4]).Where(fun x -> x > 3);;
val it : seq<int> = seq [5; 6; 4]
 
(2)OrderBy
 
OrderByは、関数を与えてその関数を施した値を基準にしてソートします。
すなわち、関数を施した値がキーとなり、それが基準となるわけです。
(ソートキーといいます。)
(関数を施した値は比較可能IComparableでないといけません。)
 
> ([2;5;-1;6;3;4]).OrderBy(fun x -> x);;
val it : IOrderedEnumerable<int> = seq [-1; 2; 3; 4; ...]
 
> ([2;5;-1;6;3;4]).OrderBy(fun x -> (-1)*x);;
val it : IOrderedEnumerable<int> = seq [6; 5; 4; 3; ...]
 
またOrderByはオーバーロードされていて、こちらはタプルの2番目の成分に、IComparer<_>インターフェイスを実装したクラスのインスタンスを渡します。
例えば絶対値の小さい順で並べてみます。
 
> let myAbs x  = if x >= 0 then x
               else (-1)*x;;
 
val myAbs : int -> int
 
> let myAbsOrder = { new IComparer<int> with 
                    member this.Compare(l,r) = 
                       (myAbs l) - (myAbs r)   };;
 
val myAbsOrder : IComparer<int>
 
> ([-2;5;-1;6;3;4]).OrderBy((fun x -> x),myAbsOrder);;
val it : IOrderedEnumerable<int> = seq [-1; -2; 3; 4; ...]
 
このあたりが分かりにくい方はこちらのエントリーをご覧になってください。 
 
 
Seq系の関数を使うと次のようになります。
 
> [-2;5;-1;6;3;4] |> Seq.sort;;
 
val it : seq<int> = seq [-2; -1; 3; 4; ...]
 
> [-2;5;-1;6;3;4] |> Seq.sortBy (fun x -> -1*x);;
val it : seq<int> = seq [6; 5; 4; 3; ...]
 
(3)、ThenBy, ThenByDescending
ソートキーを複数指定する場合には、ThenBy, ThenByDescendingをSortにつなげます。
ThenByDescendingは降順指定となります。
 
例のためにレコード型を定義しておきます。
 
type Emp =
    {ID : int;//ID番号
     name : string;//名前
     height : float;//身長
     sex :int //0が男,1が女
     }
     member this.disp () =
        printfn "%2d %s %3.1f %A" this.ID this.name this.height this.sex
 
サンプルデータを定義しておきます。
 
Jhonが2人いることに留意しておいてください。
 
let EmpSeq = seq[{ID = 1;name = "Jhon";height = 168.3;sex = 0};
                {ID = 3;name = "Jhon";height = 161.1;sex = 0};
                {ID = 8;name = "Kim";height = 168.3;sex = 1};
                {ID = 2;name = "Sawyer";height = 168.7;sex = 0};
                {ID = 13;name = "Michael";height = 155.0;sex = 0};
                {ID = 19;name = "Revecca";height = 154.8;sex = 1};
                {ID = 11;name = "Hugo";height = 176.6;sex = 0};
                {ID = 21;name = "Maggie";height = 149.1;sex = 1};
                {ID = 7;name = "Ben";height = 157.6;sex = 0}]
 
ではThenBy, ThenByDescendingを使ってみます。
let temp = EmpSeq.OrderBy(fun p -> p.sex).ThenBy(fun p -> p.name).ThenByDescending(fun p -> p.height)
 
> temp |> Seq.iter(fun p ->p.disp());;
 7 Ben 157.6 0
11 Hugo 176.6 0
 1 Jhon 168.3 0
 3 Jhon 161.1 0
13 Michael 155.0 0
 2 Sawyer 168.7 0
 8 Kim 168.3 1
21 Maggie 149.1 1
19 Revecca 154.8 1
val it : unit = ()
 
男女順 -> 名前順 -> 身長(逆順)でソートされています。
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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