J'ai une méthode IEnumerable<T>
que j'utilise pour rechercher des contrôles dans une page WebForms.IEnumerable et récursivité à l'aide de rendement return
La méthode est récursive et j'ai quelques problèmes pour renvoyer le type que je veux quand le yield return
renverra la valeur de l'appel récursif.
Mon code se présente comme suit:
public static IEnumerable<Control>
GetDeepControlsByType<T>(this Control control)
{
foreach(Control c in control.Controls)
{
if (c is T)
{
yield return c;
}
if(c.Controls.Count > 0)
{
yield return c.GetDeepControlsByType<T>();
}
}
}
Cela jette actuellement une erreur "Impossible de convertir le type d'expression". Si toutefois cette méthode renvoie le type IEnumerable<Object>
, le code est généré, mais le type incorrect est renvoyé dans la sortie.
Existe-t-il un moyen d'utiliser yield return
tout en utilisant la récursivité?
http://stackoverflow.com/questions/1815497/enumerating-collections-that-are-not-inherently-ienumerable/ 1815600 # 1815600: lien vers "mrydengrens" réponse sur le sujet "énumération des collections qui ne sont pas intrinsèquement IEnumerable?" Son exemple de code est basé sur un article de blog d'Eric Lippert vous montrant comment utiliser les piles dans l'énumération récursive avec Linq, évitant ainsi l'utilisation de la mémoire par les itérateurs. imho très utile! – BillW
BTW. 'if (c.Controls.Count> 0)' -> 'if (c.Controls.Any())', surtout si vous cédez aussi :) – mayu
Je ne pense pas que cette affaire puisse être rentable. Pour être complet, j'ai fourni une implémentation sans "yield". S'il vous plaît voir ci-dessous :) Et c'est un one-liner aussi :) – mayu