2012年01月28日

FormのControlsをLINQできない?

Formクラスに配置してあるコントロールを列挙したいことはよくあります。例えば、テキストボックスだけを取り出してみましょう。

//C#の場合
var query = from Control c in Controls
where c is TextBox
select c;
foreach (var c in query)
{
//何かの処理
}

'VBの場合
Dim query = From c In Controls Where TypeOf c Is TextBox
For Each c In query
'何かの処理
Next


LINQにはクエリ構文とメソッド構文があります。これをメソッド構文で書こうとすると・・・。
linq.png
WhereメソッドがIntelli Senseに出てきません。なのでビルドエラーになります。正しくはこちら。

//C#の場合
var textBoxes = Controls.Cast<Control>().Where(c => c is TextBox);
foreach (var c in textBoxes)
{
//何かの処理
}

'VBの場合
Dim textBoxes = Controls.Cast(Of Control)().Where(Function(c) TypeOf c Is TextBox)
For Each c In textBoxes
'何かの処理
Next


Whereメソッドの前にCastメソッドを挟みましょう。

ちなみに上記のコードと同様のことをしたいならOfTypeメソッドでもできます。

//C#の場合
var textBoxes = Controls.OfType<TextBox>();
foreach (var c in textBoxes)
{
//何かの処理
}

'VBの場合
Dim textBoxes = Controls.OfType(Of TextBox)()
For Each c In textBoxes
'何かの処理
Next


OfTypeメソッドは、コレクションの中から指定した型の要素だけを取り出すことができます。

Controlsプロパティの型であるControlCollectionクラスは、LINQの前からある古いクラスなのでジェネリック版IEnumerableインターフェイスを実装していません。なので直接、WhereなどのLINQ系メソッドを呼び出せないのでしょう。クエリ構文で書いた場合は内部的にCastメソッドが呼び出されているようです。

今回のまとめ。
LINQを使うときに、「Intelli Senseに出てくる項目が少なくね?」と思ったらCastメソッドを呼んでみましょう。
タグ:.net
posted by ぺるたご at 15:12| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/248959339

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

この広告は1年以上新しい記事の投稿がないブログに表示されております。