ControlCollection扩展方法优化

时间:2010-04-23 08:21:31

标签: c# linq extension-methods yield-return

对我编写的扩展方法有疑问,如下所示:

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();

1 个答案:

答案 0 :(得分:2)

它将运行您的第一个方法(迭代器)来查找所有控件,是的,但它会一次检查一个值。也就是说,它会找到一个控件,使用Where子句检查它,找到下一个,检查它等等。我无法在算法中看到任何优化 - 无论你做什么,你必须检查每个控件(一次),这就是你正在做的事情。