スポンサーサイト

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

F#によるLinq to Obj入門 (17) Zip 遅延処理とそうでないもの

○Zip
 
Zipは二つのシークエンスから、同時に一つづつ取り出せて、それを組み合わせて新しいシークエンスを作ります。
 
次のようなシグネチャーとなります。
 
static member Zip : 
        first:IEnumerable<'TFirst> * 
        second:IEnumerable<'TSecond> * 
        resultSelector:Func<'TFirst, 'TSecond, 'TResult> -> IEnumerable<'TResult> 
 
引数のfirst,secondはそれぞれのシークエンスで、resultSelectorが「同時に取り出した要素をどう処理して新しい値を作るかを指示する関数」となります。
 
> Enumerable.Zip([1;2;3],[4;5;6],(fun x y -> x + y));;
val it : seq<int> = seq [5; 7; 9]
 
> Enumerable.Zip([1;2;3],[4;5;6],(fun x y -> (x,y)));;
val it : seq<int * int> = seq [(1, 4); (2, 5); (3, 6)]
 
もちろん、第一引数のインスタンスメソッドとしても使えます。
 
> ([1;2;3]).Zip([4;5;6],(fun x y -> x + y));;
val it : seq<int> = seq [5; 7; 9]
 
要素数が不ぞろいは場合は短い方の最後まで計算します。
 
> ([1;2]).Zip([4;5;6],(fun x y -> x + y));;
val it : seq<int> = seq [5; 7]
 
一方Seqモジュールの方のSeq.zipは二つのシークエンスから、ひとつづつ取り出して、タプルを作って返します。
 
> Seq.zip;;
val it : (seq<'a> -> seq<'b> -> seq<'a * 'b>) = <fun:clo@2>
 
> Seq.zip [1;2;3] [4;5;6];;
val it : seq<int * int> = seq [(1, 4); (2, 5); (3, 6)]
 
> Seq.zip [1;2] [4;5;6];;
val it : seq<int * int> = seq [(1, 4); (2, 5)]
 
Seq.zip3もあります。
 
> Seq.zip3 [1;2;3] [4;5;6] [7;8;9];;
val it : seq<int * int * int> = seq [(1, 4, 7); (2, 5, 8); (3, 6, 9)]
 
おまけで、Linqで使われるメソッドを遅延処理とそうでないものについて一覧にしてみました。
遅延評価には○をつけてあります。
 
Aggregate        
All                
Any
Average
○Cast            
○Concat            
Contains
Count
○DefaultIfEmpty        
○Distinct            
ElementAt        
ElementAtOrDefault
○Empty    
○Except
First
FirstOrDefault
○GroupBy
○GroupJoin
○Intersect
○Join
Last
LastOrDefault
LongCount
Max
Min
○OfType
○OrderBy
○OrderByDescending
○Range
○Repeat
○Reverse
○Select
○SelectMany
SequenceEqual
Single
SingleOrDefault
○Skip
○SkipWhile
Sum
○Take
○TakeWhile
○ThenBy
○ThenByDescending
ToArray
ToDictionary
ToList
ToLookup
○Union
○Where      
スポンサーサイト

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

コメントの投稿

非公開コメント

支持→指示

No title

訂正しました。ありがとうございます。
今更ながら、ただいまパーサ入門勉強中です。
プロフィール

T GYOUTEN

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

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

この人とブロともになる

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