スポンサーサイト

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

F#によるLinq to Obj入門 (15) Cast OfType

今はあまり使われませんが、.NET 2.0の時代ArrayListというクラスがありました。
例えば次の様に使います。
 
> open System.Collections.Generic
open System.Linq
open System.Collections;;
 
> let aL = new ArrayList();;
val aL : ArrayList
 
> aL.Add(3);aL.Add(4);aL.Add(5);;
 
> aL.Count;;
val it : int = 3
 
ここでLINQのメソッドを適用してみようとしても、大部分のメソッドは適用できません。
これはArrayListがIEnumerableインターフェイスは備えていても、IEnumerable<>インターフェイスを備えていないからです。
ここで、Castの出番です。
シグネチャーは次のようになります。
 
static member Cast : 
        source:IEnumerable -> IEnumerable<'TResult> 
        
(いつも通り第一引数のインスタンスメソッドとしても使えます。)
 
つまりIEnumerable型から、IEnumerable<>型への変換関数です。
 
使ってみます。
 
> let castedAL = aL.Cast<int>();;
val castedAL : seq<int>
 
> castedAL.Select(fun x -> 2*x);;
val it : seq<int> = seq [6; 8; 10]
 
通常はつないで使います。
 
> aL.Cast<int>().Select(fun x -> 2*x);;
val it : seq<int> = seq [6; 8; 10]
 
さて、ArrayListはobj型のcollectionです。3,4,5とint型の値を入れましたが、ここでstring型の値を追加してみます。
 
> aL.Add("six");;
 
さて先ほどのCastを使用してみます。
 
> aL.Cast<int>().Select(fun x -> 2*x);;
val it : seq<int> = Error: 指定されたキャストは有効ではありません。
 
あたりまえですがstrignをintにキャストできないので、エラーがでてきます。
 
このような場合、OfTypeを使うと、指定された型に基づいて IEnumerable の要素をフィルター処理した上でIEnumerable<>型に変換してくれます。
 
シグネチャーは次の通りです。
 
static member OfType : 
        source:IEnumerable -> IEnumerable<'TResult> 
 
(いつも通り第一引数のインスタンスメソッドとしても使えます。)
 
では使ってみます。
 
> aL.OfType<int>().Select(fun x -> 2*x);;
val it : seq<int> = seq [6; 8; 10]
 
なおSeqモジュールでCastに対応するのはSeq.castです。
 
> Seq.cast;;
val it : (IEnumerable -> seq<'a>) = <fun:clo@10>
 
OfTypeに対応するものはありません。
 
ということで、レガシーコード向けのメソッドCase,OfTypeの紹介でした。
スポンサーサイト

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

trackback


この記事にトラックバックする(FC2ブログユーザー)

Seq.ofType

【F#】Seq.ofType

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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