2010-04-23 2 views
2

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

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 или выполняет «runtime» оптимизацию вызова для выполнения условие на «полное» перечисление (если вы понимаете, что я имею в виду).

Во-вторых, есть ли какие-либо другие оптимизации, которые я могу сделать, чтобы код работал лучше.

Пример может выглядеть следующим образом:

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

Для проблемы с производительностью, возможно, взгляните на http://msmvps.com/blogs/jon_skeet/archive/2010/03/25/just-how-lazy-are-you.aspx – Oliver

+0

только то, что я был ищет - спас меня некоторое время, спасибо –

ответ

2

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

Смежные вопросы