Controls コレクションが IEnumerable メソッドをすべて提供しないのはなぜですか? 質問する

Controls コレクションが IEnumerable メソッドをすべて提供しないのはなぜですか? 質問する

ASP.Net の ControlCollection がどのように動作するのかよくわからないので、誰かこのことについて説明していただけるとありがたいです。

私は最近、拡張メソッドとLinqの魔法を発見しました。これが有効な構文ではないことがわかり、とても悲しくなりました。

var c=Controls.Where(x => x.ID=="Some ID").SingleOrDefault();

しかし、私が知る限りでは、そのようなメソッドを提供するインターフェースControlsを実装しているのでIEnumerable、何が起こっているのでしょうか? なぜそれがうまく機能しないのでしょうか? 少なくともこの問題を回避する適切な方法を見つけました:

var list = (IEnumerable<Control>)Controls;
var this_item = list.Where(x => x.ID == "Some ID").SingleOrDefault();

ベストアンサー1

いいえ、IEnumerableには拡張メソッドがあまりありません。あります。 はextendsIEnumerable<T>ですが、それらは 2 つの別々のインターフェースです。IEnumerable<T>IEnumerable

通常のLINQの変換方法は、Cast<T>()そしてOfType<T>()拡張メソッドはする非ジェネリックインターフェースを拡張する:

IEnumerable<TextBox> textBoxes = Controls.OfType<TextBox>();
IEnumerable<Control> controls = Controls.Cast<Control>();

2 つの違いは、OfType必要なタイプではない項目をスキップし、Cast代わりに例外をスローすることです。

ジェネリックIEnumerable<T>型への参照を取得すると、残りのすべての LINQ メソッドが使用できるようになります。

おすすめ記事