2010年01月31日

エントリ・ポイントを含むアセンブリ(Assemblyオブジェクト)を取得

   このエントリーをはてなブックマークに追加 Clip to Evernote
以下は、現在実行されているアセンブリのバージョンを得るコードです。


GetName() というメソッド名が紛らわしいんですよね。
GetName()で返るのは、文字列ではなく、System.Reflection.AssemblyName クラスの インスタンスです。

GetExecutingAssembly の代わりに、GetEntryAssembly を使えば、 エントリポイント(Mainメソッド)を含むアセンブリの情報を取得できます。
クラスライブラリ側で、実行中のexeのアセンブリ情報を利用したい場合に使えます。
以下のコードは、バージョン情報を得るコードです。


もちろん、そのパス名や、アセンブリ表示名も取得できます。


  

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

2010年01月23日

再帰メソッドで、yield returnしたい

   このエントリーをはてなブックマークに追加 Clip to Evernote
再帰メソッドの戻り値を IEnumerable<T>にする場合についてまとめてみました。
順列を列挙するプログラムを例に説明します。
まず、以下のコードを見てください。


このコードの問題点は、_GetPermutations というメソッドの中で、Printメソッドを 呼び出している点です。
これだと、順列を求めるコードと、求めた順列を使って処理をするコードを明確に 分離することができません。
Permutationクラスは、いろんな場面で使える構造になっていないわけです。 問題が異なれば、Printメソッドの部分を書き直さなくてはなりません。

これを解決する方法のひとつが、イベントやdelegateを使う方法です。
順列が求まるたびに、イベントを発行すれば、Permutationクラスの利用者が Permutationクラスに手を入れることなく、自由に独自の処理を書くことができます。

ただ、この方法にも欠点があります。
例えば、GUIのあるプログラムで、次へボタンを押すたびに、順列をひとつずつ表示する ことを考えて見ましょう。こういった要求には、イベント発行する方法は上手く対応する ことができません。

Permutationクラスの利用する側で、Next メソッドなどを使い、ひとつずつ取り出せれば 良いですよね。
それには、Enumerate メソッドの戻り値を、IEnumerable<T>にするのが良さそうです。

以下に、戻り値を、IEnumerable<T> にしたPermutationクラスを示します。


注目すべき点は、再帰メソッドを呼び出して、返ってきた戻り値の扱いです(★印)。
return result とは書けません。
foreachで、一つ一つ要素を取り出し、yield return しています。こうすることで、再帰メソッドで、戻り値をIEnumerable<T>にすることができます。

全ての結果を Listなどに溜め込む方法でも、Enumerateメソッドの戻り値をIEnumerable<T>に出来ますが (この場合は、下請けメソッドの_GetPermutationsの戻り値は、IEnumerable<T>にはなりません)、 全てを列挙し終わらないと、Enumerateメソッドから制御を戻せませんので、 順列の元となる要素数が多い場合には、最初のひとつを取り出すのにも多くの時間を 要してしまい好ましくありません。

では、これを使う側のコードを示します。
まずはforeachで取り出すコード


次に、IEnumerator<T>.MoveNext, IEnumerator<T>.Currentを使うコード


ボタンをクリックするごとに、次の順列を取り出し、labelに表示しています。
  
Posted by gushwell at 23:27Comments(0)TrackBack(0)

2010年01月17日

シェルピンスキーのギャスケット

   このエントリーをはてなブックマークに追加 Clip to Evernote
1次元セルオートマトンで、シェルピンスキーのギャスケットを描くプログラムを書いてみました。



Silverlightで、BackgroundWorker 、WriteableBitmap を使うサンプルコードとしてどうぞ。
ソースコードは、こちらに載せています。

面白いのは、このプログラムのデータ部を変えるだけで、こんな図も描けます。




こちらは、1次元セルオートマトンのルール30と言われているものです。
このプログラムのソースコードは、 こちらです。
  
Posted by gushwell at 23:46Comments(0)TrackBack(0)

2010年01月14日

2010年01月10日

ナノピコ教室のプログラムをSilverlightアプリへ

   このエントリーをはてなブックマークに追加 Clip to Evernote
随分昔に出版された『ナノピコ教室・プログラミング問題集』(駒木悠二+有澤誠 編 共立出版株式会社)に掲載されている問題をC#で解いたものを、昨年前半にこのブログで紹介しました。

現在、これらのプログラムを再度見直し&修正して、
Gushwell's C# Programming Pageの「C#プログラム小品集」に移そうとしているところです。

すでに、いくつかは移したのですが、
「オセロ最短詰め」「数独を解く」「梅花碁」「8クイーンゲーム」「面積最大の領域」などは、せっかくなのでコンソールアプリからSilverlightアプリに書きなおしブラウザ上で動作を確認できるようにしようと考えています。

これらのプログラムはすべて2次元の盤データを扱うのですが、それぞれ、その時の気分でBoardクラスを作成していたので、この際、すべてに共通する BoardBaseクラスを書き、これから派生させて使うようにしようと検討中。

そうすれば、今後、2次元のデータを使うBoardクラスを書く際は、このBoardBaseクラスが使えることになりますし、
僕の書いたコードで学習しようとしている人(そんな人がいるのかというのは置いといて...)にとっても、似たようなコードを何べんも読み解く必要が無くなるので良いのかな。
ついでに、画面の描画もBoardCanvasというクラスを作り共通化しようとしています。

そして、

board[x,y] = BlackPiece; // x,yの位置に黒石を置く

と書くと、モデルであるBoardオブジェクトが変更されるとともに、画面も更新させられればGood。
Boardクラス内でイベントを発生させ、BoardCanvasでイベントを受け取り、描画させればいいかな。
細かな点は、いろいろ試行錯誤して決めていくつもり。

ところで、Silverlightをいじり始めた時は、Paintイベントが無いのに違和感がありましたが、パネルオブジェクトに対し、

panel.Children.Add(element);
とか
panel.Children.Remove(element);
とするだけで、描画/消去ができるのは、思いのほか便利だと感じ始めています。

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

2010年01月09日

メルマガ:C#プログラミングレッスン 読者数1900名突破

   このエントリーをはてなブックマークに追加 Clip to Evernote
メールマガジン「C#プログラミングレッスン」の購読者数が 1900名を突破しました。\(^^)/
購読してくださっている方、どうもありがとうございます。
目標の2000名突破が見えてきました。
このペースだと、5月頃にはクリアできそうです。

1月12日(火)からは、新しい連載「どう書くorg編」が始まります。
どうぞご期待ください。
  
Posted by gushwell at 16:19Comments(0)TrackBack(0)

2010年01月07日

String.PadLeft

   このエントリーをはてなブックマークに追加 Clip to Evernote
MSDNのクラスライブラリリファレンスを見てたら、
こんなメソッドがあるのを知りました。
PadLeftは、文字を右寄せし、指定した文字数になるまで、
左側に空白または指定した文字を埋め込んでくれます。
とすると、
と表示されます。
同様に、PadRight という右側に文字を埋め込むメソッドもあります。
  
Posted by gushwell at 23:33Comments(0)TrackBack(0)

2010年01月03日

新年のご挨拶

   このエントリーをはてなブックマークに追加 Clip to Evernote
皆さん、あけましておめでとうございます。

今年も「窓際プログラマーの独り言」「Gushwell's C# Programming Page」「C#プログラミングレッスン」をよろしくお願いします。

今、メールマガジン「C#プログラミングレッスン」の新連載「どう書く?.org編」の構想を練っているところです。
何を取り上げるのかを決めるのに意外と手間取っています。
たぶん、「どう書く?.org編」を4カ月ほど続け、そのあとに、(Visual Studio 2010 がいつ発売されるかにも因りますが)、C#4.0, .NET4 関連の話題を取り上げられればいいかなと思っています。

それと、Gushwell's C# Programming Pageの「C#プログラム小品集」をもっと充実させたいと思います。

この2つでかなりの時間を割くことになりそうな予感。
このブログも皆さんに忘れられないように更新していければと思います。
  
Posted by gushwell at 22:53Comments(0)TrackBack(0)