'where()'方法的问题

时间:2009-03-23 09:01:34

标签: c# .net linq

参考我关于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)))

1 个答案:

答案 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