2010年12月23日

C#でググった結果に僕のページが2つもあった

   このエントリーをはてなブックマークに追加 Clip to Evernote
Googleでキーワード C# で検索(3週間以内)したら、
僕に関連したページが2つも先頭ページにあったので、
記念に残しておきます。

google   

Posted by gushwell at 22:43Comments(2)TrackBack(0)

2010年12月18日

SelectManyと2次元配列の素敵な関係 再び

   このエントリーをはてなブックマークに追加 Clip to Evernote
前回の記事が不評だったので、 今度は、もうすこし真剣に考えてみる。
じゃあ、前回の記事はいい加減だったのか、と言われると、困るけど...

以下のような2次元配列があったとします。
通常、2次元配列の要素にアクセスするには、2重ループを書くのが普通だと思います。
上記コードでも、全要素にアクセスできますが、各要素の位置が分かりません。

そこで、LINQのSelectManyを使った、2次元配列のアクセスについて考えてみます。

例えば、上記配列の要素から、100より大きな数を取り出し、昇順に並べ替えたいとします。
その際に、その要素のインデックスも把握したいとしましょう。

SelectMany(2つのfrom句)を使うと、以下のように書くことができます。
これをfor文、foreach文を使って書くとすると、もっと多くのコードを書かないといけなくなると 思われます。


ただ、上記のように、インデックスの上限を決め打ちにしたくない場合は、
いちいち、2つのfrom句を書くのが面倒だったりします。
SelectMenyの部分を 拡張メソッドとして、定義すれば、さらに便利になりそうです。

そこで、 「予定は未定Blog版」の「SelectMany があればいいんじゃないだろうか?」の記事を参考にさせてもらいつつ、 以下のような拡張メソッドを定義してみました。


ここでは、3つの拡張メソッドを定義しています。
前述のコードだと、3つのうちの最初の Select メソッドが使えます。
クエリ式だと以下のように書けます。
2つめのSelectは、インデックスを受け取らないバージョンの Selectです。
ここでは、2倍した値が100より大きな値を昇順に表示しています。

最後の Sequential メソッドは、単純に、配列の要素を順に列挙するメソッドです。

  
Posted by gushwell at 10:30Comments(0)TrackBack(1)

2010年12月16日

SelectManyと2次元配列の素敵な関係

   このエントリーをはてなブックマークに追加 Clip to Evernote
この記事は、C# Advent Calendar jp: 2010 への参加記事(12/16分)です。

技術系Advent Calendarについては、こちらの記事をどうぞ。

こちら「SelectManyと2次元配列の素敵な関係 再び 」もお読みいただければと思います。

これまでのC# Advent Calenderの記事を読んでみると、高度な話題が多く、僕をはじめ多くの人がついていけないのではないかと思ったり...
ということで、当初はかなりニッチな話題を書こうと思っていたのですが、それを取りやめ、もう少し易しい話題を取り上げたいと思います。
でも実用的かどうかは分かりませんが...


では、本題「SelectManyと2次元配列の素敵な関係」に入ります。

以下のような2次元配列があったとします。
通常、2次元配列の要素にアクセスするには、2重ループを書くのが普通だと思います。
上記コードでも、全要素にアクセスできますが、各要素の位置が分かりません。
ここでは、LINQのSelectManyを使い、2重ループを、一重のループにする方法をお見せします。

まずは、2次元配列にアクセスするためのインデックスのクラスを定義します。


名前がいまいちですが、それは置いといて、
次に、SelectManyを使い(2つの from を使い)、以下のようなメソッドを定義し ます。


これで、配列のすべてのインデックスを順に取り出すことができます。
ジェネリックメソッドにしているので、int以外の配列もOKです。
これは拡張メソッドにしても良いかもしれませんね。
ここまでが準備です。

そして、このAllPointsメソッドを使えば、配列のすべての要素にアクセスするのに、


と書くことができます。

配列から100より大きな値だけを抜き出したいなら、


と書けます。
foreach文もif文も使いたく無いという方は、次のように書くことができます。


2次元配列を扱うのに、もう2重ループは必要ありませんね。
  
Posted by gushwell at 21:43Comments(3)TrackBack(2)

2010年12月09日

LINQ to SQL番外編 - NULL許容の列を扱う

   このエントリーをはてなブックマークに追加 Clip to Evernote
NorthwindデータベースのEmployeesテーブルの ReportsTo列は、NULLを許可する 型として定義されています。
そのため、「LINQ to SQLエンティティクラス」の Employee.ReprotsToプロパティも、


と、Northwind.designer.csに書かれています。

System.Nullableは、int? と同じ意味です。

これがわかれば、クエリ式を書くのもそう難しいことではありません。


ReportsToがNULLのものだけ取得したいのなら、


と書けばOKです。

では、Customersテーブルの Fax列(NULLを許可しています)は、どうでしょうか?。
Fax列は、「LINQ to SQLエンティティクラス」のCustomer.Faxでは、C#のString 型にマッピングされています。
System.Nullable とはなっていません。
string型は参照型で、もともとnullを保持できますから、そのままでOKということです。
というか、文法上、System.Nullable とすることはできません。

ですから、


と書けば、Fax番号が登録されていない顧客だけを抜き出すことができます。
  
Posted by gushwell at 23:30Comments(0)TrackBack(0)

2010年12月06日

円周率を10000桁まで求める

   このエントリーをはてなブックマークに追加 Clip to Evernote
円周率を10000桁まで求めるプログラムをSilverlightで書いてみました。
BigNumber という多倍長整数演算クラスを作成し、マチンの公式をつかって円周率を求めています。

こちらで、プログラムを動作させることができます。
ソースコードも公開していますので、興味のある方はどうぞ。   
Posted by gushwell at 21:52Comments(0)TrackBack(0)

2010年12月05日

Silverlightでプロジェクトに追加したファイルの一覧を得る

   このエントリーをはてなブックマークに追加 Clip to Evernote
Silverlightでプロジェクトに追加したファイルの一覧を得る方法を調べてみました。

例えば、複数のイメージファイルをプロジェクトに追加し、 ListBoxのその画像を表示する C# プログラムを考えます。

まず、Silverlightプロジェクトに追加したイメージファイルは、
プロパティのビルドアクションで、「埋め込まれたリソース」に設定します。
こうすると、プログラムコードでは、
でその名前の一覧を得ることができます。
ここで得られたリソースの名前は、
で、Streamオブジェクトとして取り出すことができます。
このstreamをBitmapImageに変換するには、
とします。
ここまでくれば、Imageコントロールに、このbitmapを割り当てればOKです。
具体的には、
というImageを格納するListを用意し、
とすれば、リソースにあるイメージを LIstBix に表示することができます。

最初は、どうやったら、stream から Imageオブジェクトを作成できるのかがわからず、
このコードにたどり着くまでに思いのほか時間をかけてしまいました。
下の画像がその実行結果です。
imagelist
  
Posted by gushwell at 22:22Comments(0)TrackBack(0)