Оптимизация метода расширения ControlCollection - PullRequest
2 голосов
/ 23 апреля 2010

получил вопрос относительно метода расширения, который я написал, который выглядит следующим образом:

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

1 Ответ

2 голосов
/ 23 апреля 2010

Будет запущен ваш первый метод (итератор), чтобы найти все элементы управления, да, но он будет проверять по одному значению за раз. То есть он найдет один элемент управления, проверит его с помощью предложения Where, найдет следующий, проверит его и так далее. Я не вижу никаких оптимизаций в алгоритме - что бы вы ни делали, вы должны проверять каждый элемент управления (один раз), и это то, что вы делаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...