2009-03-23 5 views
1

En référence à ma question sur filtering ('constraining') types in a foreach loop, j'essaie la première méthode dans la réponse de Charlie Flowers, en utilisant la méthode .Where sur la collection, mais le compilateur ne peut pas trouver. Où sur le système Classe .Web.UI.ControlCollection. Ceci est dérivé de IEnumerable, alors quel est le problème ici?Problème avec la méthode 'where()'

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

Répondre

4

Commencez par vous assurer que vous avez using System.Linq; en haut du fichier.

Si vous avez une collection qui implémente IEnumerable mais pas IEnumerable<T>, mais vous savez tous les objets sont d'un type donné (par exemple Control), vous pouvez utiliser la méthode d'extension Cast<T> LINQ:

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

Toutefois, compte tenu de votre clause Where, il pourrait être plus prudent, dans ce cas, d'utiliser la méthode OfType<T>, qui retourne seulement ceux d'un type donné (Cast<T> lève une exception si quelque chose est erroné):

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

La légère différence entre ceci et votre version est que ce qui précède retournera des sous-classes de TextBox, où-comme votre version GetType() == typeof(TextBox) ne le fera pas.

En fait, la plupart des méthodes d'extension LINQ ne sont définis que pour IEnumerable<T>/IQueryable<T>, pas IEnumerable/IQueryable.

+0

Merci. Je cherchais à utiliser 'where' dans un exemple, pour différencier OfType, pour obtenir uniquement les types exacts, pas tous les types assignables. Le Cast fonctionne bien. – ProfK

Questions connexes