2010-04-23 43 views
2

a question concernant une méthode d'extension que je l'ai écrit qui ressemble à ceci:ControlCollection optimisation de la méthode d'extension

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

L'idée ici est de trouver tous les contrôles qui correspondent à un critère spécifques (d'où le Func < ..>) dans la collection de contrôles. Ma question est:

Est-ce que la deuxième méthode (qui a le Func) d'abord appeler la première méthode pour trouver tous les contrôles de type T et exécute alors la condition where ou ne le « exécution » d'optimiser l'appel pour effectuer le où condition sur l'énumération "entière" (si vous obtenez ce que je veux dire).

Deuxièmement, y at-il d'autres optimisations que je peux faire au code pour mieux fonctionner.

Un exemple peut ressembler à ceci:

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

Pour le problème de performance, peut-être jeter un oeil à: http://msmvps.com/blogs/jon_skeet/archive/2010/03/25/just-how-lazy-are-you.aspx – Oliver

+0

juste ce que j'étais vous cherchez - m'a sauvé du temps, merci –

Répondre

2

Il courrait votre première méthode (le iterator) pour trouver tous les contrôles, oui, mais il vérifierait une valeur à la fois. C'est-à-dire qu'il trouverait un contrôle, le vérifierait en utilisant la clause Where, trouverait le suivant, vérifierait et ainsi de suite. Je ne vois pas vraiment d'optimisations dans l'algorithme - quoi que vous ayez à vérifier chaque contrôle (une fois) et c'est ce que vous faites.