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 メソッドが使用できるようになります。