2009-03-23 12 views
1

filtering ('constraining') types in a foreach loopで私の質問を参照して、コレクションの.Whereメソッドを使用して、チャーリーフラワーズの答えの最初のメソッドを試していますが、コンパイラが見つかりません。 .Web.UI.ControlCollectionクラス。これはIEnumerableから派生したものなので、ここで何が問題なのですか?'where()'メソッドの問題

foreach (var control in Controls.Where(i => i.GetType() == typeof(TextBox))) 

答えて

4

最初に、using System.Linq;がファイルの先頭にあることを確認してください。

foreach (var control in Controls.Cast<Control>() 
     .Where(i => i.GetType() == typeof(TextBox))) {...} 

:あなたはIEnumerableなくIEnumerable<T>を実装するコレクションを持っていますが、あなたがオブジェクトを知っている場合

指定された型(のようなControl)のすべてです、あなたはCast<T> LINQの拡張メソッドを使用することができますしかし、あなたのWhere句を考えると、それだけで特定のタイプのものを返すOfType<T>方法を、使用することを、この場合には、より賢明かもしれません(何が間違っている場合Cast<T>が例外をスロー):

foreach (var control in Controls.OfType<TextBox>()) {...} 

このバージョンとの若干の違いは、GetType() == typeof(TextBox)バージョンでは表示されないサブクラスがTextBoxであることです。

基本的には、LINQの拡張メソッドのほとんどが唯一IEnumerable<T>/IQueryable<T>、ないIEnumerable/IQueryableのために定義されています。

+0

ありがとうございました。私は実際に、OfTypeから区別するために、「どこで」どこの型を使用して、正確な型だけを取得し、すべての代入可能型を取得するのではないかと考えていました。キャストはうまく動作します。 – ProfK