【问题标题】:ControlCollection extension method optimizationControlCollection 扩展方法优化
【发布时间】:2010-04-23 08:21:31
【问题描述】:

有关于我编写的扩展方法的问题,如下所示:

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<..>)。我的问题是:

第二种方法(具有Func)是否首先调用第一种方法以查找T类型的所有控件,然后执行where条件或“运行时”是否优化调用以对“整个”执行where条件" 枚举(如果你明白我的意思)。

其次,我是否可以对代码进行任何其他优化以更好地执行。

示例如下所示:

var checkbox = this.Controls.FindControlsOfType<MyCustomCheckBox>(
                                ctrl => ctrl.CustomProperty == "Test"
                                )
                                .FirstOrDefault();

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    相关资源
    最近更新 更多