2012年05月13日

Interactive Extensions(Ix) - StartWithメソッド

   Clip to Evernote   このエントリーをはてなブックマークに追加      
EnumerableEx.StartWith拡張メソッドは、シーケンスの先頭に値を付加してくれます。 これ、前からあれば良いなーと思ってた機能です。

使い方はこんな感じ。


0 と nums が連結されて、新たなシーケンスとなります。

なお、可変引数となっているので、


という書き方もできます。

この場合の結果は、


と表示されます。
  

Posted by gushwell at 22:30Comments(0)TrackBack(0)

2012年05月06日

Interactive Extensions(Ix) - SkipLastメソッド

   Clip to Evernote   このエントリーをはてなブックマークに追加      
EnumerableEx.SkipLast拡張メソッドは、後ろからn個の要素をスキップします。

シーケンスの要素数がいくつかわからないけど、最後の n 個は無視したい、という場合に使うことに なると思います。


結果は、


と表示されます。

  
Posted by gushwell at 21:30Comments(0)TrackBack(0)

2012年05月03日

Interactive Extensions(Ix) - Shareメソッド

   Clip to Evernote   このエントリーをはてなブックマークに追加      
EnumerableEx.Share拡張メソッドは、
名前からすれば、列挙を共有するメソッドということになるわけですが、
なんて説明したら良いのか言葉でうまく言い表せません。

Shareメソッドで作成されたシーケンスは、ある場所にバッファリングされ、
列挙する際は、そのバッファーが作成されると言ったら良いのでしょうか?

まずは、そのコードと動きを見た方が分かりやすいです。


結果は、


です。


ではありません。

これを利用すれば、こんなコードが書けます。


結果は、


と出力されます。
これをShareを使わないで書くとすると、どうなるかを考えてみると、このメソッドの偉大さが 分かります。
このコードの場合は、String.Joinを使えばいいんじゃねっ、という突っ込みは無しでお願いします。

ちなみに、Share()メソッドが返す方は、IBuffer<TSource> となっています。

もう一つのオーバーロードメソッドがありますが、そちらは試してません。

  
Posted by gushwell at 22:00Comments(0)TrackBack(0)

2012年04月29日

Interactive Extensions(Ix) - Scanメソッド

   Clip to Evernote   このエントリーをはてなブックマークに追加      
EnumerableEx.Scan拡張メソッドは、LINQ標準のAggregateと同じことをやりますが、
その途中結果を列挙してくれます。返ってくるシーケンスの最後の要素が、
Aggregateと同じ値になります。

まずは、Aggregateの例です。
1から10までを足した結果を求めています。


もちろん、結果は、


と出力されます。

次に、Scanを使ったコードです。


実行結果を示します。


Aggregateって何?という方も、これならば、計算の途中結果が分かるので、理解できる と思います。

もう一つ例を示します。
さっきの例とほとんど同じだけど、Scanの別バージョンを使った例です。


結果は、以下の通り。


  
Posted by gushwell at 22:00Comments(0)TrackBack(0)

2012年04月25日

Interactive Extensions(Ix) - Returnメソッド

   Clip to Evernote   このエントリーをはてなブックマークに追加      
EnumerableEx.Return static メソッドは、単一の要素のシーケンスを返します。

以下、ためしに書いたコードです。


実行すると、以下のような結果が得られます。


どんな時に利用するのかが、想像力の無い僕にはすぐには思いつきません。


と書く代わりに、


と書きたいということなのかな?
確かに、インテリセンスは聞くけど、new [] {} とタイプするのは それほど苦じゃないしなー。

そうじゃなくて、評価を遅らせたいという時に利用するということなのかな?
それなら何となくわかる気がするけど、具合的な例が思い浮かばない。
たぶん、そういった場面に遭遇すれば、「ああ、こういうときに使えるのか!」
とひらめくと思うのですが...

  
Posted by gushwell at 23:30Comments(0)TrackBack(0)

2012年04月22日

Interactive Extensions(Ix) - Memoizeメソッド

   Clip to Evernote   このエントリーをはてなブックマークに追加      
EnumerableEx.Memoize拡張メソッドは、シーケンスをメモ化してくれます。
このメソッドの戻り値を使い、複数回呼び出した場合は、キャッシュされた
値を返します。
同じシーケンスを複数回列挙する場合に、速度向上に威力を発揮します。

まずは、値がキャッシュされているかどうかが確かめられるように、
以下のような、シーケンスを生成するメソッドを定義します。


最初に、Memoizeを使わないコードだとどうなるかを見てみます。


これを実行した結果を以下に示します。


複数回、列挙されているのが分かります。
では、次に、Memoizeを使った例です。


以下、実行結果です。


注目してほしいのは、


ではないということです。つまり、Memoize()を呼びだしても
列挙はされません。遅延実行の原則がここでも生きています。

  
Posted by gushwell at 23:00Comments(0)TrackBack(0)

2012年04月18日

Interactive Extensions(Ix) - Retryメソッド

   Clip to Evernote   このエントリーをはてなブックマークに追加      
EnumerableEx.Retry拡張メソッドは、列挙中に例外が発生すると、再度列挙を試みてくれます。

こんなコードを書いてみました。


この実行例を示します。


途中で、例外が発生したので、再度列挙しているのが分かります。
なお、再列挙中にまた例外が発生すると、再度列挙してくれます。

Retry()メソッドには、retryCountを引数に取るオーバーロードが用意されています。


のように書けば、2回まで再列挙を試みます。

  
Posted by gushwell at 23:30Comments(0)TrackBack(0)

2012年04月15日

Interactive Extensions(Ix) - Repeatメソッド

   Clip to Evernote   このエントリーをはてなブックマークに追加      
EnumerableEx.Repeatメソッドは、拡張メソッドと、staticメソッドの2種類のメソッドがあります。
Repeatメソッドは、その名の通り、値を繰り返し列挙することができます。

まずは、拡張メソッドの例です。


無限に繰り返すので、Takeメソッドで最初の 28 個だけを取り出しています。
これが無いと、プログラムが終わりません。
この結果は、


と表示されます。

繰り返し回数を指定することもできます。


とすれば、3回繰り返します。
シーケンスの要素を3つだけを取り出すのではなく、入力となるシーケンスを3回繰り返して
値を生成するということです。
つまり結果は以下の通りです。



では、次に、staticメソッドの例です。


結果は、


です。拡張メソッドのほうとは微妙に違っています。
こちらば、第一引数で渡したオブジェクトの方が、列挙する型となります。
この例では、stringではなく、string[] が繰り返されることになります。

  
Posted by gushwell at 22:00Comments(0)TrackBack(0)

2012年04月11日

Interactive Extensions(Ix) - OnErrorResumeNextメソッド

   Clip to Evernote   このエントリーをはてなブックマークに追加      
EnumerableEx.OnErrorResumeNext拡張メソッドは、値を列挙中に例外が発生しても、
例外が発生しなくても引数で指定したシーケンスを後続し、列挙するメソッドです。

例えば、次のようなメソッドがあったとします。


このメソッドは、ある確率で、列挙中に例外が発生します。

このメソッドに続けて、OnErrorResumeNext メソッドを呼び出すコードを示します。


これを実行すると、


とか


などと表示されます。前者は例外が発生した例、後者は例外が発生しない例です。

  
Posted by gushwell at 22:30Comments(0)TrackBack(0)

2012年04月08日

Interactive Extensions(Ix) - MaxByメソッド、MinByメソッド

   Clip to Evernote   このエントリーをはてなブックマークに追加      
EnumerableEx.MaxBy拡張メソッドは、指定されたキーの値で最大値だったもの(複数)を返します。
Max拡張メソッドは、一つの値を返しますが、MaxByは、該当するすべての値を列挙します。

以下のようなコードを書いてみました。


実行結果は、以下の通りです。


EnumerableEx.MinBy拡張メソッドもあります。
使い方は、同じなので、コードは省略します。

  
Posted by gushwell at 22:00Comments(0)TrackBack(0)

2012年04月04日

Interactive Extensions(Ix) - Maxメソッド、Minメソッド

   Clip to Evernote   このエントリーをはてなブックマークに追加      
EnumerableEx.Max拡張メソッドは、IComparer<T> を受け取る Maxメソッドのオーバーロードです。


IComparer<T> を実装したクラスを定義し、オブジェクトの大きさを判断し、その最大値を返します。

こんなコードを書いてみました。
あまり良い例ではありませんが、ご容赦を。

まずは、IComparer を実装した比較クラスを定義します。
ここでは、DateTimeの日にちで、大小を判断しています。


これを使った、Maxメソッドのコードです。


実行すると、


が出力されます。

すでに、IComparer<T> を実装してるプログラムの場合には、このMaxは使えますね。


Min拡張メソッドもあります。
使い方は同じです。


を実行すれば、


が出力されます。

  
Posted by gushwell at 23:00Comments(0)TrackBack(0)

2012年03月28日

Interactive Extensions(Ix) - IgnoreElementsメソッド

   Clip to Evernote   このエントリーをはてなブックマークに追加      
EnumerableEx.IgnoreElements拡張メソッドは、
空のシーケンスを返すメソッドです。

以下のコードでは、何もコンソールには表示されません。


いったい何の役に立つのかわかりません。

戻り値を使わないよ、と明示するのに使うのかなと思いましたが、
LINQの場合、そういったこともほとんどないのかなと思ってしまいます。

  
Posted by gushwell at 23:00Comments(0)TrackBack(0)

2012年03月25日

Interactive Extensions(Ix) - IsEmptyメソッド

   Clip to Evernote   このエントリーをはてなブックマークに追加      
EnumerableEx.IsEmpty拡張メソッドは、シーケンスが、空かどうかを返してくれます。

以下のようなコードで動きを確かめてみました。


これを実行すると、


が出力されます。
今まで以下のように書いていたわけですが、


IsEmpty使えば、より直感的に書けるってことですね。

  
Posted by gushwell at 23:00Comments(0)TrackBack(0)

2012年03月22日

Interactive Extensions(Ix) - Ifメソッド

   Clip to Evernote   このエントリーをはてなブックマークに追加      
EnumerableEx.Ifメソッドは、条件が真ならば、第2引数で指定したシーケンスを、偽ならば、
第3引数で指定したシーケンスを返します。
第3引数が省略された場合は、空のシーケンスが返ります。

以下、ためしに書いてみたコードです。


ランダムにnums1, nums2のどちらかが列挙されます。

  
Posted by gushwell at 23:30Comments(0)TrackBack(0)

2012年03月20日

Interactive Extensions(Ix) - Hideメソッド

   Clip to Evernote   このエントリーをはてなブックマークに追加      
今日は、EnumerableEx.Hideメソッドです。

具象型ではなく、インターフェースに対してプログラミングするのが、
オブジェクト指向プログラミングの原則なわけで、
配列や、Listではなく、IEnumerable<int> としてコードを書きたい場合が
あります。
こんな感じですね。


しかし、IEnumerable とタイプするのが面倒です。
ということで、Hideメソッドの出番になります。
Hideメソッドを使えば、以下のように、var が使えるようになります。


というのが、僕の考えた Hideメソッドの使い方なんだけど、
これで合っているのかな?

実際、Hide使う場面って全く思い浮かばない。
メソッドの引数に渡すときは、自動でUpCastされるから必要ないしなー。
LINQ to Object使うときにも、ドットでつなげればいいんだし...


追記 2013/03/21
上で書いた内容は全然的外れでした。
Hideは、具象クラスを隠し、IEnumerable<T>として提供するメソッドということです。
つまり、上記の seqは、元の型情報が隠れてしまうため、
オリジナルの int[] にダウンキャストすることを防げるということです。
教えてくださった皆さんありがとうございました。
  
Posted by gushwell at 22:00Comments(2)TrackBack(0)

2012年03月18日

Interactive Extensions(Ix) - Generateメソッド

   Clip to Evernote   このエントリーをはてなブックマークに追加      
EnumerableEx.Generateメソッドは、シーケンスを生成するメソッドで、
for 文のように、初期値、継続判定、繰り返し関数 を指定し、最後の引数である値生成関数で
値を生成します。


以下は、これを実行した結果です。


なお、for 文で似たようなコードを書いてみました。


これだと、遅延実行にならず、即時実行なので、まったく同じというわけではありませんが
Generateメソッドの機能を理解する助けにはなると思います。

  
Posted by gushwell at 21:09Comments(0)TrackBack(0)

2012年03月15日

Interactive Extensions(Ix) - Finallyメソッド

   Clip to Evernote   このエントリーをはてなブックマークに追加      
EnumerableEx.Finally拡張メソッドは、列挙が完了したら、指定したActionが呼び出されます。

以下が、ためしに書いたコードです。


結果は、


と表示されます。

  
Posted by gushwell at 22:30Comments(0)TrackBack(0)

2012年03月13日

Interactive Extensions(Ix) - DoWhileメソッド

   Clip to Evernote   このエントリーをはてなブックマークに追加      
EnumerableEx.Dowhile拡張メソッドは、
do 〜 while 文と同様に、最低一回は列挙を行い、条件に合致している間、
列挙を繰り返します。

以下のようなコードを書いてみました。


例えば、実行されている時間が、10:24:02 だとすると、10:24:10 に達するまで、
123123123123と列挙を繰り返します。
10:24:32 だとすると、123と列挙は1回で終わります。

  
Posted by gushwell at 23:30Comments(0)TrackBack(0)

2012年03月11日

Interactive Extensions(Ix) - Doメソッド

   Clip to Evernote   このエントリーをはてなブックマークに追加      
EnumerableEx.Do拡張メソッドは、ForEachと同様、各値にActionを適用します。
違いは、ForEach がvoid であるのに対し、Do は、シーケンスをそのまま返すメソッドと
なっている点です。

うまい例を思い浮かびませんが、以下のようなコードを書いてみました。


結果は、以下のようになります。

ちなみに、ForEachを使ったコードは以下の通り。


Sumメソッド使えばいいんじゃね、という突っ込みはなし、でお願いします。

  
Posted by gushwell at 22:00Comments(0)TrackBack(0)

2012年03月01日

Interactive Extensions(Ix) - DistinctUntilChangedメソッド

   Clip to Evernote   このエントリーをはてなブックマークに追加      
EnumerableEx.DistinctUntilChanged拡張メソッドは、同じ値が続いた場合、
それを除去するメソッドです。

ためしに書いたコード。


結果は以下のようになりました。


  
Posted by gushwell at 23:00Comments(0)TrackBack(0)

2012年02月26日

Interactive Extensions(Ix) - Distinctメソッド

   Clip to Evernote   このエントリーをはてなブックマークに追加      
EnumerableEx.Distinct拡張メソッドは、シーケンスの重複する値を削除するメソッドですが、
LINQ 標準のものと異なり、重複比較をするためのキーセレクター(デリゲート)を受けとります。

以下が、ためしに書いたコードです。


3の剰余をキーセレクターとしました。
これにより、余りが1 である 1 4 7 10... は同じ値とみなされます。

結果は、


と出力されます。

  
Posted by gushwell at 23:00Comments(0)TrackBack(0)

2012年02月22日

Interactive Extensions(Ix) - Catchメソッド

   Clip to Evernote   このエントリーをはてなブックマークに追加      
EnumerableEx.Catch拡張メソッドは、シーケンス列挙時に、例外が発生した場合に、
引数で指定した別のシーケンスを後に続けることができるというメソッドです。

以下のようなメソッドを書いてみました。


CreateNumsメソッドがシーケンスを列挙するのですが、
ある確率で、列挙途中で例外を発生するようにしています。

Catchメソッドだけだと、例外が処理済みと認識されないので、
例外を処理済みにするには、try-catchが必要みたいです。

結果は、例えば、以下のようになります。


  
Posted by gushwell at 23:30Comments(0)TrackBack(0)

2012年02月19日

Interactive Extensions(Ix) - Concatメソッド

   Clip to Evernote   このエントリーをはてなブックマークに追加      
EnumerableEx.Concatメソッドは、複数のシーケンスを一つのシーケンスに連結するメソッドです。
標準のConcat メソッドは、


と宣言されており、2つのシーケンスの連結ですが、IxのConcatは、


と宣言されていて、拡張メソッドと、通常のstaticメソッドの2つが用意されています。
後者のメソッドを利用するコードを書いてみました。


実行すると、3つのシーケンスが連結され、以下のような結果が得られます。


  
Posted by gushwell at 22:24Comments(0)TrackBack(0)

2012年02月12日

Interactive Extensions(Ix) - Bufferメソッド

   Clip to Evernote   このエントリーをはてなブックマークに追加      
EnumerableEx.Buffer拡張メソッドは、シーケンスを指定した個数単位で分割して列挙します。
言葉だけで説明するのは難しいですね。
以下のコードを見てください。


結果は、


と出力され、指定した6個単位で分割されているのが確認できます。

変数 buffersは、IEnumerable<IList<int>> 型となります。

  
Posted by gushwell at 23:30Comments(0)TrackBack(0)

2012年02月08日

Interactive Extensions(Ix) - ForEachメソッド

   Clip to Evernote   このエントリーをはてなブックマークに追加      
インタラクティブエクステンション(Interactive Extensions; Ix)は、
LINQ to Objectに拡張機能を供給するMicrosoftが提供しているライブラリです。
ここからダウンロードできます。
http://www.microsoft.com/download/en/details.aspx?id=27203
NuGetのIx_Experimental-Mainでも入手できます。

どんなものかなーと興味があったので、動かしてみました。
しばらくの間、このライブラリで遊んでみようと思います。

今日は、ForEachです。

これを使えば、いちいち ToList(), ToArray() を呼び出さなくても、ForEachメソッドが
使えます。
foreach 文を使わずにシーケンスに対する反復処理が書けるので楽ですね。


なお、上記コードは、以下のコードと同等です。

このForEachメソッドは多くの人が自作したと思われますが、これで自作メソッドを
使う必要もなくなりましたね。
  
Posted by gushwell at 22:30Comments(0)TrackBack(1)