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 メソッドは、単純に、配列の要素を順に列挙するメソッドです。



 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52103538
この記事へのトラックバック
素敵なエントリーの登録ありがとうございます - .NET Clipsからのトラックバック
SelectManyと2次元配列の素敵な関係 再び【.NET Clips】at 2011年01月07日 00:47