参考我关于filtering ('constraining') types in a foreach loop的问题,我正在尝试Charlie Flowers的第一个方法,在集合上使用.Where方法,但编译器无法在System.Web.UI上找到。 .ControlCollection类。这是从IEnumerable派生的,那么这里的问题是什么?
foreach (var control in Controls.Where(i => i.GetType() == typeof(TextBox)))
答案 0 :(得分:4)
首先,确保文件顶部有using System.Linq;
。
如果您有一个实现IEnumerable
但不是IEnumerable<T>
的集合,但您知道对象都是给定类型(例如Control
),那么您可以使用{ {1}} LINQ扩展方法:
Cast<T>
但是,根据您的foreach (var control in Controls.Cast<Control>()
.Where(i => i.GetType() == typeof(TextBox))) {...}
子句,在这种情况下,使用Where
方法可能更为谨慎,该方法仅返回给定类型的方法(OfType<T>
抛出一个异常,如果有什么不对的话):
Cast<T>
此版本与您的版本之间的细微差别在于上述内容将返回foreach (var control in Controls.OfType<TextBox>()) {...}
的子类,其中 - TextBox
版本不会。
基本上,大多数LINQ扩展方法仅针对GetType() == typeof(TextBox)
/ IEnumerable<T>
定义,而不是IQueryable<T>
/ IEnumerable
。