2012年05月13日
Interactive Extensions(Ix) - StartWithメソッド
EnumerableEx.StartWith拡張メソッドは、シーケンスの先頭に値を付加してくれます。
これ、前からあれば良いなーと思ってた機能です。
使い方はこんな感じ。
0 と nums が連結されて、新たなシーケンスとなります。
なお、可変引数となっているので、
という書き方もできます。
この場合の結果は、
と表示されます。
使い方はこんな感じ。
0 と nums が連結されて、新たなシーケンスとなります。
なお、可変引数となっているので、
という書き方もできます。
この場合の結果は、
と表示されます。
2012年05月06日
Interactive Extensions(Ix) - SkipLastメソッド
EnumerableEx.SkipLast拡張メソッドは、後ろからn個の要素をスキップします。
シーケンスの要素数がいくつかわからないけど、最後の n 個は無視したい、という場合に使うことに なると思います。
結果は、
と表示されます。
シーケンスの要素数がいくつかわからないけど、最後の n 個は無視したい、という場合に使うことに なると思います。
結果は、
と表示されます。
2012年05月03日
Interactive Extensions(Ix) - Shareメソッド
EnumerableEx.Share拡張メソッドは、
名前からすれば、列挙を共有するメソッドということになるわけですが、
なんて説明したら良いのか言葉でうまく言い表せません。
Shareメソッドで作成されたシーケンスは、ある場所にバッファリングされ、
列挙する際は、そのバッファーが作成されると言ったら良いのでしょうか?
まずは、そのコードと動きを見た方が分かりやすいです。
結果は、
です。
ではありません。
これを利用すれば、こんなコードが書けます。
結果は、
と出力されます。
これをShareを使わないで書くとすると、どうなるかを考えてみると、このメソッドの偉大さが 分かります。
このコードの場合は、String.Joinを使えばいいんじゃねっ、という突っ込みは無しでお願いします。
ちなみに、Share()メソッドが返す方は、IBuffer<TSource> となっています。
もう一つのオーバーロードメソッドがありますが、そちらは試してません。
名前からすれば、列挙を共有するメソッドということになるわけですが、
なんて説明したら良いのか言葉でうまく言い表せません。
Shareメソッドで作成されたシーケンスは、ある場所にバッファリングされ、
列挙する際は、そのバッファーが作成されると言ったら良いのでしょうか?
まずは、そのコードと動きを見た方が分かりやすいです。
結果は、
です。
ではありません。
これを利用すれば、こんなコードが書けます。
結果は、
と出力されます。
これをShareを使わないで書くとすると、どうなるかを考えてみると、このメソッドの偉大さが 分かります。
このコードの場合は、String.Joinを使えばいいんじゃねっ、という突っ込みは無しでお願いします。
ちなみに、Share()メソッドが返す方は、IBuffer<TSource> となっています。
もう一つのオーバーロードメソッドがありますが、そちらは試してません。
2012年04月29日
Interactive Extensions(Ix) - Scanメソッド
EnumerableEx.Scan拡張メソッドは、LINQ標準のAggregateと同じことをやりますが、
その途中結果を列挙してくれます。返ってくるシーケンスの最後の要素が、
Aggregateと同じ値になります。
まずは、Aggregateの例です。
1から10までを足した結果を求めています。
もちろん、結果は、
と出力されます。
次に、Scanを使ったコードです。
実行結果を示します。
Aggregateって何?という方も、これならば、計算の途中結果が分かるので、理解できる と思います。
もう一つ例を示します。
さっきの例とほとんど同じだけど、Scanの別バージョンを使った例です。
結果は、以下の通り。
その途中結果を列挙してくれます。返ってくるシーケンスの最後の要素が、
Aggregateと同じ値になります。
まずは、Aggregateの例です。
1から10までを足した結果を求めています。
もちろん、結果は、
と出力されます。
次に、Scanを使ったコードです。
実行結果を示します。
Aggregateって何?という方も、これならば、計算の途中結果が分かるので、理解できる と思います。
もう一つ例を示します。
さっきの例とほとんど同じだけど、Scanの別バージョンを使った例です。
結果は、以下の通り。
2012年04月25日
Interactive Extensions(Ix) - Returnメソッド
EnumerableEx.Return static メソッドは、単一の要素のシーケンスを返します。
以下、ためしに書いたコードです。
実行すると、以下のような結果が得られます。
どんな時に利用するのかが、想像力の無い僕にはすぐには思いつきません。
と書く代わりに、
と書きたいということなのかな?
確かに、インテリセンスは聞くけど、new [] {} とタイプするのは それほど苦じゃないしなー。
そうじゃなくて、評価を遅らせたいという時に利用するということなのかな?
それなら何となくわかる気がするけど、具合的な例が思い浮かばない。
たぶん、そういった場面に遭遇すれば、「ああ、こういうときに使えるのか!」
とひらめくと思うのですが...
以下、ためしに書いたコードです。
実行すると、以下のような結果が得られます。
どんな時に利用するのかが、想像力の無い僕にはすぐには思いつきません。
と書く代わりに、
と書きたいということなのかな?
確かに、インテリセンスは聞くけど、new [] {} とタイプするのは それほど苦じゃないしなー。
そうじゃなくて、評価を遅らせたいという時に利用するということなのかな?
それなら何となくわかる気がするけど、具合的な例が思い浮かばない。
たぶん、そういった場面に遭遇すれば、「ああ、こういうときに使えるのか!」
とひらめくと思うのですが...
2012年04月22日
Interactive Extensions(Ix) - Memoizeメソッド
EnumerableEx.Memoize拡張メソッドは、シーケンスをメモ化してくれます。
このメソッドの戻り値を使い、複数回呼び出した場合は、キャッシュされた
値を返します。
同じシーケンスを複数回列挙する場合に、速度向上に威力を発揮します。
まずは、値がキャッシュされているかどうかが確かめられるように、
以下のような、シーケンスを生成するメソッドを定義します。
最初に、Memoizeを使わないコードだとどうなるかを見てみます。
これを実行した結果を以下に示します。
複数回、列挙されているのが分かります。
では、次に、Memoizeを使った例です。
以下、実行結果です。
注目してほしいのは、
ではないということです。つまり、Memoize()を呼びだしても
列挙はされません。遅延実行の原則がここでも生きています。
このメソッドの戻り値を使い、複数回呼び出した場合は、キャッシュされた
値を返します。
同じシーケンスを複数回列挙する場合に、速度向上に威力を発揮します。
まずは、値がキャッシュされているかどうかが確かめられるように、
以下のような、シーケンスを生成するメソッドを定義します。
最初に、Memoizeを使わないコードだとどうなるかを見てみます。
これを実行した結果を以下に示します。
複数回、列挙されているのが分かります。
では、次に、Memoizeを使った例です。
以下、実行結果です。
注目してほしいのは、
ではないということです。つまり、Memoize()を呼びだしても
列挙はされません。遅延実行の原則がここでも生きています。
2012年04月18日
Interactive Extensions(Ix) - Retryメソッド
EnumerableEx.Retry拡張メソッドは、列挙中に例外が発生すると、再度列挙を試みてくれます。
こんなコードを書いてみました。
この実行例を示します。
途中で、例外が発生したので、再度列挙しているのが分かります。
なお、再列挙中にまた例外が発生すると、再度列挙してくれます。
Retry()メソッドには、retryCountを引数に取るオーバーロードが用意されています。
のように書けば、2回まで再列挙を試みます。
こんなコードを書いてみました。
この実行例を示します。
途中で、例外が発生したので、再度列挙しているのが分かります。
なお、再列挙中にまた例外が発生すると、再度列挙してくれます。
Retry()メソッドには、retryCountを引数に取るオーバーロードが用意されています。
のように書けば、2回まで再列挙を試みます。
2012年04月15日
Interactive Extensions(Ix) - Repeatメソッド
EnumerableEx.Repeatメソッドは、拡張メソッドと、staticメソッドの2種類のメソッドがあります。
Repeatメソッドは、その名の通り、値を繰り返し列挙することができます。
まずは、拡張メソッドの例です。
無限に繰り返すので、Takeメソッドで最初の 28 個だけを取り出しています。
これが無いと、プログラムが終わりません。
この結果は、
と表示されます。
繰り返し回数を指定することもできます。
とすれば、3回繰り返します。
シーケンスの要素を3つだけを取り出すのではなく、入力となるシーケンスを3回繰り返して
値を生成するということです。
つまり結果は以下の通りです。
では、次に、staticメソッドの例です。
結果は、
です。拡張メソッドのほうとは微妙に違っています。
こちらば、第一引数で渡したオブジェクトの方が、列挙する型となります。
この例では、stringではなく、string[] が繰り返されることになります。
Repeatメソッドは、その名の通り、値を繰り返し列挙することができます。
まずは、拡張メソッドの例です。
無限に繰り返すので、Takeメソッドで最初の 28 個だけを取り出しています。
これが無いと、プログラムが終わりません。
この結果は、
と表示されます。
繰り返し回数を指定することもできます。
とすれば、3回繰り返します。
シーケンスの要素を3つだけを取り出すのではなく、入力となるシーケンスを3回繰り返して
値を生成するということです。
つまり結果は以下の通りです。
では、次に、staticメソッドの例です。
結果は、
です。拡張メソッドのほうとは微妙に違っています。
こちらば、第一引数で渡したオブジェクトの方が、列挙する型となります。
この例では、stringではなく、string[] が繰り返されることになります。
2012年04月11日
Interactive Extensions(Ix) - OnErrorResumeNextメソッド
EnumerableEx.OnErrorResumeNext拡張メソッドは、値を列挙中に例外が発生しても、
例外が発生しなくても引数で指定したシーケンスを後続し、列挙するメソッドです。
例えば、次のようなメソッドがあったとします。
このメソッドは、ある確率で、列挙中に例外が発生します。
このメソッドに続けて、OnErrorResumeNext メソッドを呼び出すコードを示します。
これを実行すると、
とか
などと表示されます。前者は例外が発生した例、後者は例外が発生しない例です。
例外が発生しなくても引数で指定したシーケンスを後続し、列挙するメソッドです。
例えば、次のようなメソッドがあったとします。
このメソッドは、ある確率で、列挙中に例外が発生します。
このメソッドに続けて、OnErrorResumeNext メソッドを呼び出すコードを示します。
これを実行すると、
とか
などと表示されます。前者は例外が発生した例、後者は例外が発生しない例です。
2012年04月08日
Interactive Extensions(Ix) - MaxByメソッド、MinByメソッド
EnumerableEx.MaxBy拡張メソッドは、指定されたキーの値で最大値だったもの(複数)を返します。
Max拡張メソッドは、一つの値を返しますが、MaxByは、該当するすべての値を列挙します。
以下のようなコードを書いてみました。
実行結果は、以下の通りです。
EnumerableEx.MinBy拡張メソッドもあります。
使い方は、同じなので、コードは省略します。
Max拡張メソッドは、一つの値を返しますが、MaxByは、該当するすべての値を列挙します。
以下のようなコードを書いてみました。
実行結果は、以下の通りです。
EnumerableEx.MinBy拡張メソッドもあります。
使い方は、同じなので、コードは省略します。
2012年04月04日
Interactive Extensions(Ix) - Maxメソッド、Minメソッド
EnumerableEx.Max拡張メソッドは、IComparer<T> を受け取る Maxメソッドのオーバーロードです。
IComparer<T> を実装したクラスを定義し、オブジェクトの大きさを判断し、その最大値を返します。
こんなコードを書いてみました。
あまり良い例ではありませんが、ご容赦を。
まずは、IComparer を実装した比較クラスを定義します。
ここでは、DateTimeの日にちで、大小を判断しています。
これを使った、Maxメソッドのコードです。
実行すると、
が出力されます。
すでに、IComparer<T> を実装してるプログラムの場合には、このMaxは使えますね。
Min拡張メソッドもあります。
使い方は同じです。
を実行すれば、
が出力されます。
IComparer<T> を実装したクラスを定義し、オブジェクトの大きさを判断し、その最大値を返します。
こんなコードを書いてみました。
あまり良い例ではありませんが、ご容赦を。
まずは、IComparer
ここでは、DateTimeの日にちで、大小を判断しています。
これを使った、Maxメソッドのコードです。
実行すると、
が出力されます。
すでに、IComparer<T> を実装してるプログラムの場合には、このMaxは使えますね。
Min拡張メソッドもあります。
使い方は同じです。
を実行すれば、
が出力されます。
2012年03月28日
Interactive Extensions(Ix) - IgnoreElementsメソッド
EnumerableEx.IgnoreElements拡張メソッドは、
空のシーケンスを返すメソッドです。
以下のコードでは、何もコンソールには表示されません。
いったい何の役に立つのかわかりません。
戻り値を使わないよ、と明示するのに使うのかなと思いましたが、
LINQの場合、そういったこともほとんどないのかなと思ってしまいます。
空のシーケンスを返すメソッドです。
以下のコードでは、何もコンソールには表示されません。
いったい何の役に立つのかわかりません。
戻り値を使わないよ、と明示するのに使うのかなと思いましたが、
LINQの場合、そういったこともほとんどないのかなと思ってしまいます。
2012年03月25日
Interactive Extensions(Ix) - IsEmptyメソッド
EnumerableEx.IsEmpty拡張メソッドは、シーケンスが、空かどうかを返してくれます。
以下のようなコードで動きを確かめてみました。
これを実行すると、
が出力されます。
今まで以下のように書いていたわけですが、
IsEmpty使えば、より直感的に書けるってことですね。
以下のようなコードで動きを確かめてみました。
これを実行すると、
が出力されます。
今まで以下のように書いていたわけですが、
IsEmpty使えば、より直感的に書けるってことですね。
2012年03月22日
Interactive Extensions(Ix) - Ifメソッド
EnumerableEx.Ifメソッドは、条件が真ならば、第2引数で指定したシーケンスを、偽ならば、
第3引数で指定したシーケンスを返します。
第3引数が省略された場合は、空のシーケンスが返ります。
以下、ためしに書いてみたコードです。
ランダムにnums1, nums2のどちらかが列挙されます。
第3引数で指定したシーケンスを返します。
第3引数が省略された場合は、空のシーケンスが返ります。
以下、ためしに書いてみたコードです。
ランダムにnums1, nums2のどちらかが列挙されます。
2012年03月20日
Interactive Extensions(Ix) - Hideメソッド
今日は、EnumerableEx.Hideメソッドです。
具象型ではなく、インターフェースに対してプログラミングするのが、
オブジェクト指向プログラミングの原則なわけで、
配列や、Listではなく、IEnumerable<int> としてコードを書きたい場合が
あります。
こんな感じですね。
しかし、IEnumerable とタイプするのが面倒です。
ということで、Hideメソッドの出番になります。
Hideメソッドを使えば、以下のように、var が使えるようになります。
というのが、僕の考えた Hideメソッドの使い方なんだけど、
これで合っているのかな?
実際、Hide使う場面って全く思い浮かばない。
メソッドの引数に渡すときは、自動でUpCastされるから必要ないしなー。
LINQ to Object使うときにも、ドットでつなげればいいんだし...
追記 2013/03/21
上で書いた内容は全然的外れでした。
Hideは、具象クラスを隠し、IEnumerable<T>として提供するメソッドということです。
つまり、上記の seqは、元の型情報が隠れてしまうため、
オリジナルの int[] にダウンキャストすることを防げるということです。
教えてくださった皆さんありがとうございました。
具象型ではなく、インターフェースに対してプログラミングするのが、
オブジェクト指向プログラミングの原則なわけで、
配列や、Listではなく、IEnumerable<int> としてコードを書きたい場合が
あります。
こんな感じですね。
しかし、IEnumerable
ということで、Hideメソッドの出番になります。
Hideメソッドを使えば、以下のように、var が使えるようになります。
というのが、僕の考えた Hideメソッドの使い方なんだけど、
これで合っているのかな?
実際、Hide使う場面って全く思い浮かばない。
メソッドの引数に渡すときは、自動でUpCastされるから必要ないしなー。
LINQ to Object使うときにも、ドットでつなげればいいんだし...
追記 2013/03/21
上で書いた内容は全然的外れでした。
Hideは、具象クラスを隠し、IEnumerable<T>として提供するメソッドということです。
つまり、上記の seqは、元の型情報が隠れてしまうため、
オリジナルの int[] にダウンキャストすることを防げるということです。
教えてくださった皆さんありがとうございました。
2012年03月18日
Interactive Extensions(Ix) - Generateメソッド
EnumerableEx.Generateメソッドは、シーケンスを生成するメソッドで、
for 文のように、初期値、継続判定、繰り返し関数 を指定し、最後の引数である値生成関数で
値を生成します。
以下は、これを実行した結果です。
なお、for 文で似たようなコードを書いてみました。
これだと、遅延実行にならず、即時実行なので、まったく同じというわけではありませんが
Generateメソッドの機能を理解する助けにはなると思います。
for 文のように、初期値、継続判定、繰り返し関数 を指定し、最後の引数である値生成関数で
値を生成します。
以下は、これを実行した結果です。
なお、for 文で似たようなコードを書いてみました。
これだと、遅延実行にならず、即時実行なので、まったく同じというわけではありませんが
Generateメソッドの機能を理解する助けにはなると思います。
2012年03月15日
Interactive Extensions(Ix) - Finallyメソッド
EnumerableEx.Finally拡張メソッドは、列挙が完了したら、指定したActionが呼び出されます。
以下が、ためしに書いたコードです。
結果は、
と表示されます。
以下が、ためしに書いたコードです。
結果は、
と表示されます。
2012年03月13日
Interactive Extensions(Ix) - DoWhileメソッド
EnumerableEx.Dowhile拡張メソッドは、
do 〜 while 文と同様に、最低一回は列挙を行い、条件に合致している間、
列挙を繰り返します。
以下のようなコードを書いてみました。
例えば、実行されている時間が、10:24:02 だとすると、10:24:10 に達するまで、
123123123123と列挙を繰り返します。
10:24:32 だとすると、123と列挙は1回で終わります。
do 〜 while 文と同様に、最低一回は列挙を行い、条件に合致している間、
列挙を繰り返します。
以下のようなコードを書いてみました。
例えば、実行されている時間が、10:24:02 だとすると、10:24:10 に達するまで、
123123123123と列挙を繰り返します。
10:24:32 だとすると、123と列挙は1回で終わります。
2012年03月11日
Interactive Extensions(Ix) - Doメソッド
EnumerableEx.Do拡張メソッドは、ForEachと同様、各値にActionを適用します。
違いは、ForEach がvoid であるのに対し、Do は、シーケンスをそのまま返すメソッドと
なっている点です。
うまい例を思い浮かびませんが、以下のようなコードを書いてみました。
結果は、以下のようになります。
ちなみに、ForEachを使ったコードは以下の通り。
Sumメソッド使えばいいんじゃね、という突っ込みはなし、でお願いします。
違いは、ForEach がvoid であるのに対し、Do は、シーケンスをそのまま返すメソッドと
なっている点です。
うまい例を思い浮かびませんが、以下のようなコードを書いてみました。
結果は、以下のようになります。
ちなみに、ForEachを使ったコードは以下の通り。
Sumメソッド使えばいいんじゃね、という突っ込みはなし、でお願いします。
2012年03月01日
Interactive Extensions(Ix) - DistinctUntilChangedメソッド
EnumerableEx.DistinctUntilChanged拡張メソッドは、同じ値が続いた場合、
それを除去するメソッドです。
ためしに書いたコード。
結果は以下のようになりました。
それを除去するメソッドです。
ためしに書いたコード。
結果は以下のようになりました。
2012年02月26日
Interactive Extensions(Ix) - Distinctメソッド
EnumerableEx.Distinct拡張メソッドは、シーケンスの重複する値を削除するメソッドですが、
LINQ 標準のものと異なり、重複比較をするためのキーセレクター(デリゲート)を受けとります。
以下が、ためしに書いたコードです。
3の剰余をキーセレクターとしました。
これにより、余りが1 である 1 4 7 10... は同じ値とみなされます。
結果は、
と出力されます。
LINQ 標準のものと異なり、重複比較をするためのキーセレクター(デリゲート)を受けとります。
以下が、ためしに書いたコードです。
3の剰余をキーセレクターとしました。
これにより、余りが1 である 1 4 7 10... は同じ値とみなされます。
結果は、
と出力されます。
2012年02月22日
Interactive Extensions(Ix) - Catchメソッド
EnumerableEx.Catch拡張メソッドは、シーケンス列挙時に、例外が発生した場合に、
引数で指定した別のシーケンスを後に続けることができるというメソッドです。
以下のようなメソッドを書いてみました。
CreateNumsメソッドがシーケンスを列挙するのですが、
ある確率で、列挙途中で例外を発生するようにしています。
Catchメソッドだけだと、例外が処理済みと認識されないので、
例外を処理済みにするには、try-catchが必要みたいです。
結果は、例えば、以下のようになります。
引数で指定した別のシーケンスを後に続けることができるというメソッドです。
以下のようなメソッドを書いてみました。
CreateNumsメソッドがシーケンスを列挙するのですが、
ある確率で、列挙途中で例外を発生するようにしています。
Catchメソッドだけだと、例外が処理済みと認識されないので、
例外を処理済みにするには、try-catchが必要みたいです。
結果は、例えば、以下のようになります。
2012年02月19日
Interactive Extensions(Ix) - Concatメソッド
EnumerableEx.Concatメソッドは、複数のシーケンスを一つのシーケンスに連結するメソッドです。
標準のConcat メソッドは、
と宣言されており、2つのシーケンスの連結ですが、IxのConcatは、
と宣言されていて、拡張メソッドと、通常のstaticメソッドの2つが用意されています。
後者のメソッドを利用するコードを書いてみました。
実行すると、3つのシーケンスが連結され、以下のような結果が得られます。
標準のConcat メソッドは、
と宣言されており、2つのシーケンスの連結ですが、IxのConcatは、
と宣言されていて、拡張メソッドと、通常のstaticメソッドの2つが用意されています。
後者のメソッドを利用するコードを書いてみました。
実行すると、3つのシーケンスが連結され、以下のような結果が得られます。
2012年02月12日
Interactive Extensions(Ix) - Bufferメソッド
EnumerableEx.Buffer拡張メソッドは、シーケンスを指定した個数単位で分割して列挙します。
言葉だけで説明するのは難しいですね。
以下のコードを見てください。
結果は、
と出力され、指定した6個単位で分割されているのが確認できます。
変数 buffersは、IEnumerable<IList<int>> 型となります。
言葉だけで説明するのは難しいですね。
以下のコードを見てください。
結果は、
と出力され、指定した6個単位で分割されているのが確認できます。
変数 buffersは、IEnumerable<IList<int>> 型となります。
2012年02月08日
Interactive Extensions(Ix) - ForEachメソッド
インタラクティブエクステンション(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メソッドは多くの人が自作したと思われますが、これで自作メソッドを
使う必要もなくなりましたね。
LINQ to Objectに拡張機能を供給するMicrosoftが提供しているライブラリです。
ここからダウンロードできます。
http://www.microsoft.com/download/en/details.aspx?id=27203
NuGetのIx_Experimental-Mainでも入手できます。
どんなものかなーと興味があったので、動かしてみました。
しばらくの間、このライブラリで遊んでみようと思います。
今日は、ForEachです。
これを使えば、いちいち ToList(), ToArray() を呼び出さなくても、ForEachメソッドが
使えます。
foreach 文を使わずにシーケンスに対する反復処理が書けるので楽ですね。
なお、上記コードは、以下のコードと同等です。
このForEachメソッドは多くの人が自作したと思われますが、これで自作メソッドを
使う必要もなくなりましたね。



