2008年07月31日

Cast<>演算子

   このエントリーをはてなブックマークに追加 Clip to Evernote
WindowsFormsアプリのフォームに配置されたコントロールの中から、Butonnだけを取り出しすコードを C#+LINQで書こうとしたら、上手くいきません。

var buttons = this.Controls.Where(ctrl => ctrl is Button);

と書くとエラーになります。

Controlsプロパティは、ControlCollection クラスで、このクラスは、IEnumerable<T>を実装していないためにエラーになってしまうようです。

そんな時にCast演算子が使えます。

var buttons = this.Controls.Cast<Control>().Where(ctrl => ctrl is Button);

って書けばOKでした。


この記事へのコメント
var buttons = this.Controls.Where(Control ctrl => ctrl is Button);

でもイケます。
Posted by 渋木宏明(ひどり) at 2008年07月31日 21:50
渋木さん

'System.Windows.Forms.Control.ControlCollection' に 'Where' の定義が含まれておらず、型 'System.Windows.Forms.Control.ControlCollection' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。

っていうエラーになっちゃいますが...
Posted by Gushwell at 2008年07月31日 23:43
後ろの方をちゃんと見ずに、変な式書いてました (^^;

この場合は

var buttons = this.Controls.Where(Control ctrl => { return ctrl is Button});

かな。

Posted by 渋木宏明(ひどり) at 2008年08月02日 00:30
ちょっと書き換えて、以下のようにしてコンパイルしましたが、同様のエラーになります。

var buttons2 = this.Controls.Where((Control ctrl) => { return ctrl is Button; });

Whereメソッドは、IEnumerable<TSource> に対する拡張メソッドだと思いますが、
Controlsプロパティは、非ジェネリックスのIEnumerableだけを実装しているControlCollectionクラスのオブジェクトです。
そのため、直接Whereを使うことは出来ないと思うのですが...
何か勘違いしてますでしょうか?
Posted by Gushwell at 2008年08月02日 09:36
var buttons = this.Controls.TypeOf<Button>();
でいけますよ。
Posted by Yoshi at 2012年02月14日 00:16
すみません。OfType でした。
Posted by Yoshi at 2012年02月14日 00:19
Yoshiさん、ありがとうございます。
2008年当時は、まだLINQの知識が足りなかったです。
Posted by Gushwell at 2012年02月14日 22:03
 

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

http://trackback.blogsys.jp/livedoor/gushwell/51585761