スポンサーサイト

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

F#によるLinq to Obj入門 (3) Reverse Take Skip TakeWhile SkipWhile

サンプルのためのレコード型とデータを準備しておきます。(前回と同じものです。)
 
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}]
 
(1)Reverseはreverseは見ての通り逆順にする作用です。
 
例 IDが10以上のものを逆順にしてみます。
 
let temp = EmpSeq.Where(fun p -> p.ID >= 10).Reverse()
temp |> Seq.iter(fun p ->p.disp())
>
21 Maggie 149.1 1
11 Hugo 176.6 0
19 Revecca 154.8 1
13 Michael 155.0 0
val it : unit = ()
 
(2)Take は最初のいくつかをとりだします。
 
例 名前をアルファベット順にしたものの、最初の3項を取り出します。
 
let temp = EmpSeq.OrderBy(fun p -> p.name).Take(3)
temp |> Seq.iter(fun p ->p.disp())
>
 7 Ben 157.6 0
11 Hugo 176.6 0
 1 Jhon 168.3 0
 
 なお例えば全部で3項しかないものから、5項取り出せと指定すると例外が発生します。
 
(3)Skipは最初の何項かをスキップしてそのあとの部分を取り出します。
 
例 名前をアルファベット順にしたものの、3項目からを取り出します。
 
let temp = EmpSeq.OrderBy(fun p -> p.name).Skip(2)
temp |> Seq.iter(fun p ->p.disp())

 1 Jhon 168.3 0
 3 Jhon 161.1 0
 8 Kim 168.3 1
21 Maggie 149.1 1
13 Michael 155.0 0
19 Revecca 154.8 1
 2 Sawyer 168.7 0
 
 なお例えば全部で3項しかないものから、5項スキップせよと指定すると例外が発生します。
 
(4)TakeWhileは、最初から初めて、関数が真を返す間だけ部分を取り出します。一度でも偽を返すと残りは無視します。
 
例 最初から初めて名前の長さが4以下の間取り出し、残りを無視します。
 
let temp = EmpSeq.TakeWhile(fun p -> p.name.Length <=4)
temp |> Seq.iter(fun p ->p.disp())

 1 Jhon 168.3 0
 3 Jhon 161.1 0
 8 Kim 168.3 1
 
(5)SkipWhileは最初から初めて、関数が真を返す間スキップします。一度でも偽を返すと残り全部を取り出します。
 
例 最初から初めて名前の長さが4以下の間スキップし、残りを取り出します。
 
> let temp = EmpSeq.SkipWhile(fun p -> p.name.Length <=4)
temp |> Seq.iter(fun p ->p.disp());;
 
 2 Sawyer 168.7 0
13 Michael 155.0 0
19 Revecca 154.8 1
11 Hugo 176.6 0
21 Maggie 149.1 1
 7 Ben 157.6 0
 
最後にSeqモジュールで対応するものを書きだしておきます。
 
Reverse    <-> 対応するものなし。(arrayやlistではrev)
Take       <->  Seq.take
Skip       <->  Seq.skip
TakeWhile  <->  Seq.takeWhile
SkipWhile  <->  Seq.skipWhile
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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