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)