Ich habe eine IEnumerable<T>
Methode, die ich verwende, um Steuerelemente in einer WebForms-Seite zu finden.IEnumerable und Rekursion mit Renditerückgabe
Die Methode ist rekursiv und ich habe einige Probleme beim Zurückgeben der Art, die ich will, wenn die yield return
den Wert des rekursiven Aufrufs zurückgibt.
Mein Code sieht wie folgt aus:
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>();
}
}
}
Das zur Zeit wirft einen Fehler „Kann nicht Ausdruck Typ umwandeln“. Wenn diese Methode jedoch den Typ IEnumerable<Object>
zurückgibt, wird der Code erstellt, aber der falsche Typ wird in der Ausgabe zurückgegeben.
Gibt es eine Möglichkeit, yield return
zu verwenden, während auch Rekursion verwendet wird?
http://stackoverflow.com/questions/1815497/enumerating-collections-that-are-not-inherently-ienumerable/ 1815600 # 1815600: Link zu "mrydengrens" Antwort auf den Thread "Auflistungen auflisten, die nicht von Natur aus IEnumerable sind?" Sein Beispielcode basiert auf einem Blog-Artikel von Eric Lippert, der Ihnen zeigt, wie Sie Stacks in rekursiver Enumeration mit Linq verwenden, um so eine möglicherweise teure Speicherbenutzung durch Iteratoren zu vermeiden. Imho sehr nützlich! – BillW
BTW. 'if (c.Controls.Count> 0)' -> 'if (c.Controls.Any())', vor allem, wenn Sie auch nachgeben :) – mayu
Ich glaube nicht, dass dieser Fall von Nachgeben profitiert. Der Vollständigkeit halber habe ich eine Implementierung ohne "Ausbeute" angegeben. Bitte siehe unten :) Und es ist ein One-Liner zu :) – mayu