2010年10月31日

このテクニックはどうなんだろう?

   このエントリーをはてなブックマークに追加 Clip to Evernote
僕の Silverlightの知識は、Silverlight2 で止まっているので、
Silverlight4の知識を得ようと、Think IT の記事「連載:これからはじめるSilverlight 4」を読んでいるのですが、

第7回 DataGridコントロールの新しい2つの機能を使う
に掲載している以下のコードで、ちょっと不思議に思った コードがありました。

ページの中ほどにある以下のコードを引用します。
問題の箇所は、★印の箇所。
ループの度に、CollectionViewSource をnewしてるけど、そのインスタンスである myCollectionViewSource を参照しているのは、ループの外側だけです。
つまり、100回 new されたとしても、最後に new されたインスタンスしか 参照されていません。

まあ、無駄なnewをしているけど、期待した動きにはなっているから、 実害は無いのですが、とても気になってしまいます。

これは、ループの外側に移動させるべきだと思うんだけど、どうなんだろうと 思いながら、次のコードを読むと、
myCollectionViewSource が null かどうかを見て、要素があるかどうかを 判断しているコードがありました。
ここまで来て、★印の箇所が、たんなる勘違いではなく、意図的にやっていることが わかりました。
でも、こういったテクニックってどうなんだろう?
一般的なのでしょうか?
僕には、到底受け付けられないテクニックです。

まあ、この記事は、Silverlightの機能を紹介するページであって、コードをどう書くべきかを説明するページではないので、そのまま素通りしても良いのですが、気になったので、ここにアップしました。   

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

2010年10月29日

Any拡張メソッド

   このエントリーをはてなブックマークに追加 Clip to Evernote
指定した複数の値を繰り返すの記事に対して、neueccさんが、
IEnumerableを受け取るのにwhile(items.Any()) はよろしくない。
とつぶやいていました。
って、もう、半月も前のものだけれど...

なので、ちょっと書き換えてみました。
というコードを期待しているのかな?
それとも、もっと良い方法があるのかな?

まあ、Any拡張メソッドは、MSDNライブラリには、
「source の列挙は、結果が確認できるとすぐに停止します。」

とあるので、最悪でも最初の要素しかアクセスしないので、Count()メソッド使うよりも効率的だし、 僕が作成するアプリにおいては、実質的に問題になる事は無いと考えています。
それよりは、コード量が増えるほうがイヤです。

  
Posted by gushwell at 10:31Comments(6)TrackBack(0)

2010年10月11日

C#でunfold

   このエントリーをはてなブックマークに追加 Clip to Evernote
T_GYOUTENさんの記事 に触発されて、C#で3つのUnfold関数を書いてみました。

名前をどうしようか迷ったのですが、Unfoldクラスを定義し、そこに Do メソッドを定義
することにしました。一つの機能しかないstaticクラスを作る時には、名前をどうするか
悩みますね。
引数の順番は、F#とは逆にし、初期値, generator の順にしました。

まずは、一つ目のバージョンのUnfold.Doメソッド
使い方はこんな感じ。
true, false が繰り返されます。
generatorが null を返すと終了しますが、Tが値型の場合、nullがとれないので、
無限に繰り返すことになります。

2つめは、繰り返し条件を指定できるバージョン。これならば、値型でも有限のシーケンスを 得ることが できます。
使い方です。
1 2 4 8 16 32 64 128 256 512 と表示されます。

最後は、最も汎用性のあるバージョンで、F#のSeq.unfoldとほぼ同等のものです。
Tupleを使っているので、ちょっと分かりにくいかもしれませんが、
これだと、初期値に与える型と、戻り値の各要素の型を別のものにすることができます。

以下、使い方の例です。
true, false を繰り返しています。 これだと、最初に示した true, false を返すコードのほうが簡単なので、
このTuple使ったDoメソッドだからできる例を示します。
フィボナッチ数列を求めるコードです。
unfoldは強力ですが、使うにはちょっと慣れが必要ですね。

  
Posted by gushwell at 21:25Comments(2)TrackBack(0)

2010年10月07日

指定した複数の値を繰り返す

   このエントリーをはてなブックマークに追加 Clip to Evernote
前回の記事の続きです。

前回示した false true を繰り返す以下のコードは、bool型しか扱えないので、使い道が限られています。
任意の型にも対応させれば、使い道がありそうです。
ジェネリックスの出番ですね。
というクラスを作れば、
とか、
とか、いろいろ使えます。

foreach も使いたいということであれば、以下のようにGetEnumerable メソッドを追加します。
そうすれば、
なんて、書けますね。

ここまで書くと、別に要素が2つに限定することもないなーということで、
シーケンスを受け取る拡張メソッドを書いてみました。
これを使うコード例を以下に示します。
これだと、foreachでしか使えないんじゃないのと思う人もいると思いますが、いえいえ、次のような書き方もできます。
でも、使い勝手は良くないです。ラムダ式を返す部分をメソッドにしてしまったほうが良いかもしれません。
興味のある方は、EnumerableExtentions クラスにメソッドを追加してみてください。   
Posted by gushwell at 22:58Comments(2)TrackBack(0)

2010年10月04日

falseとtrueを交互に返す方法(C#)

   このエントリーをはてなブックマークに追加 Clip to Evernote
ネタ元:
a2c.get.diary ■[python] 0と1を次々返す方法
404 Blog Not Found - Algorithm - 0と1を次々と返す簡単なお仕事

すでに旬を過ぎたみたいだけど、C#で僕も書いてみました。

espresso3389の日記 で、espresso3389 さんが素晴らしいコードを紹介しているけど、もう少しオーソドックスな実装で。

true, false を交互に次々と返すようにしています。

でも、これだと、再利用性が低いので、やはりクラスにするべきかな、ということで書いたのがこれ。

dankogaiさんのコードに合わせて、いったんfunc変数に入れてから呼び出しています。
でも、Func<bool> と型を指定するのは面倒です。やはり var を使いたいです。
それと、初期値を設定できないのも、イマイチなので、

としてみました。いわゆる関数を返す関数です。
これならば、var が使えるし、初期値も与えられます。
でも、よくよく考えたら、staticフィールドは、余分ですね。
FlipFlopクラスは、
で、OKでした。
結局、espresso3389 さんのコードと、本質的には大きく変わらないものになってしまいました。
  
Posted by gushwell at 22:27Comments(4)TrackBack(1)