SG

F# で LINQ 入門 Where

 Where はシーケンスに対し抽出を行います。LINQ の中では最も使用されるメソッドの1つではないでしょうか。

open System.Linq

(* 年齢不詳の人物もいるため Option *)
type person = { name : string; age : Option<int> }

(* 公式より抜粋 http://www.guilty-crown.jp/ *)
let charactors = { name = "Shu";      age = Some(17) }
              :: { name = "Gai";      age = Some(17) } 
              :: { name = "Inori";    age = Some(16) } 
              :: { name = "Ayase";    age = Some(17) }
              :: { name = "Tsugumi";  age = Some(14) } 
              :: { name = "Shibungi"; age = Some(27) }
              :: { name = "Arugo";    age = Some(17) }
              :: { name = "Oogumo";   age = None }
              :: { name = "Fyu-Neru"; age = None }
              :: { name = "Hare";     age = Some(16) }
              :: { name = "Yahiro";   age = Some(17) }
              :: { name = "Souta";    age = Some(17) }
              :: { name = "Kanon";    age = Some(17) }
              :: { name = "Arisa";    age = Some(17) }
              :: { name = "Daryl";    age = Some(17) }
              :: []

(* 集以外で17歳以下 *)
charactors.Where(fun c -> c.name <> "Shu" && c.age.IsSome && c.age.Value <= 17)
|> Seq.iter (fun c -> printfn "%s" c.name)

実行結果

Gai
Inori
Ayase
Tsugumi
Arugo
Hare
Yahiro
Souta
Kanon
Arisa
Daryl

type person =
  {name: string;
   age: Option<int>;}
val charactors : person list =
  [{name = "Shu";
    age = Some 17;}; {name = "Gai";
                      age = Some 17;}; {name = "Inori";
                                        age = Some 16;}; {name = "Ayase";
                                                          age = Some 17;};
   {name = "Tsugumi";
    age = Some 14;}; {name = "Shibungi";
                      age = Some 27;}; {name = "Arugo";
                                        age = Some 17;}; {name = "Oogumo";
                                                          age = null;};
   {name = "Fyu-Neru";
    age = null;}; {name = "Hare";
                   age = Some 16;}; {name = "Yahiro";
                                     age = Some 17;}; {name = "Souta";
                                                       age = Some 17;};
   {name = "Kanon";
    age = Some 17;}; {name = "Arisa";
                      age = Some 17;}; {name = "Daryl";
                                        age = Some 17;}]

 ひょっとしたら集自身から取り出せるのかもしれないけれど。その展開も悪くは無い。