对我编写的扩展方法有疑问,如下所示:
public static IEnumerable<T> FindControlsOfType<T>(this ControlCollection instance) where T : class
{
T control;
foreach (Control ctrl in instance)
{
if ((control = ctrl as T) != null)
{
yield return control;
}
foreach (T child in FindControlsOfType<T>(ctrl.Controls))
{
yield return child;
}
}
}
public static IEnumerable<T> FindControlsOfType<T>(this ControlCollection instance, Func<T, bool> match) where T : class
{
return FindControlsOfType<T>(instance).Where(match);
}
这里的想法是找到与控件集合中的特定条件(因此为Func&lt; ..&gt;)匹配的所有控件。我的问题是:
第二种方法(具有Func)是否首先调用第一种方法来查找T类型的所有控件,然后执行where条件或“运行时”优化调用以执行“整体”中的where条件“枚举(如果你理解我的意思)。
其次,我是否可以对代码执行任何其他优化以更好地执行。
示例可能如下所示:
var checkbox = this.Controls.FindControlsOfType<MyCustomCheckBox>(
ctrl => ctrl.CustomProperty == "Test"
)
.FirstOrDefault();
答案 0 :(得分:2)
它将运行您的第一个方法(迭代器)来查找所有控件,是的,但它会一次检查一个值。也就是说,它会找到一个控件,使用Where子句检查它,找到下一个,检查它等等。我无法在算法中看到任何优化 - 无论你做什么,你必须检查每个控件(一次),这就是你正在做的事情。