Ich versuche, einen eleganten Weg zu finden, um Steuerelemente für ein Formular für Windows Forms zu erhalten. Zum Beispiel:
%Vor%Aber das muss sicherstellen, dass es alle Steuerelemente rekursiv durchläuft.
Was ist die eleganteste Art dies zu implementieren mit LINQ ?
LINQ ist nicht unbedingt für die Rekursion mit unbekannter Tiefe am besten geeignet. benutze einfach normalen Code ...
%Vor%mit:
%Vor%Oder wenn Sie die obige Rekursion nicht mögen:
%Vor%Dank C # 3 gibt es viele elegante Lösungen. Dieser verwendet keine LINQ-Abfrageoperatoren. Es verwendet Lambdas und Delegaten.
Dies filtert alle Steuerelemente nach bestimmten Kriterien (kann nach mehreren Kriterien filtern). Gibt mehrere Übereinstimmungen zurück. Es ermöglicht mehr als die Namenserkennung.
%Vor%Es ist ziemlich flexibel, was die Nutzung angeht
%Vor%Extension-Methoden fügen auch Anwendungen einen Erbe der Eleganz hinzu.
Die genau gleiche Logik kann in eine Erweiterungsmethode wie diese injiziert werden.
%Vor%Erweiterung Verwendung ist:
%Vor%null
Ruft die erste Erweiterungsmethode (siehe oben) auf, um alle übereinstimmenden Steuerelemente zu erhalten, und gibt dann das erste in den Übereinstimmungen zurück, andernfalls null, wenn die Übereinstimmungsliste leer ist.
Dies ist nicht effizient, weil es über alle Kontrollen iteriert, auch nachdem das erste Spiel gefunden wurde - aber nur um SO Kommentare herumspielen.
%Vor%Ich denke nicht, dass Sie rekursive Linq-Abfragen direkt erstellen können, aber Sie könnten eine rekursive Methode mit linq:
erstellen %Vor%Dies sollte eine Sequenz zurückgeben, die jedes in einer Kontrollhierarchie enthaltene Steuerelement enthält. Dann ist es einfach, eine Übereinstimmung zu finden:
%Vor%Ich persönlich würde Linq auf diese Weise vermeiden.
Nicht so einfach ...
LINQ ist nicht sehr gut in Rekursion und (benötigt Cast). Control.Controls
ist nicht LINQ aktiviert
Manchmal ist eine Methode die beste Lösung. Da Sie eine schreiben können, die für alle Controls funktioniert, ist sie sogar noch mehr als eine LINQ-Abfrage wiederverwendbar. Es könnte eine Erweiterungsmethode sein.