Linq-extension-Methode, wie Sie finden, Kinder in der Sammlung rekursive
Ich bin bereits vertraut mit Linq, haben aber wenig Verständnis von extension-Methoden ich hoffe jemand kann mir helfen.
So habe ich diese hierarchische Auflistung pseudo-code an, dh:
class Product
prop name
prop type
prop id
prop List<Product> children
Und ich haben eine Liste der Produkte Liste der Produkte.
Gibt es eine Möglichkeit, ich kann sehen für Produkte in dieser Kollektion durch die id mit einer Erweiterung Methode ? In anderen Worten muss ich ein Element irgendwo innerhalb der Hierarchie.
- Du meinst: productsList.Where(x => x.Id = = "deine_id");?
- Oder productsList.FirstOrDefault(x => x.Id = = "deine_id");? Diese gibt ein einzelnes Objekt ist, und null, wenn kein entsprechendes Objekt gefunden wird.
- Nein, ich meine, ich schauen müssen sowohl die ProductsList und ProductList->Produkt->die Kinder, Dass ist mein problem, ich kann es mit rekursiven Methode, aber ich Frage mich, Ob es eine Möglichkeit gibt, tun Sie es mit linq-Erweiterung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine generische Lösung, Kurzschluss-Traversierung der Hierarchie, wenn eine übereinstimmung gefunden wird.
Verwenden es in Ihrem Fall:
if(!Equals(attempt, default(T))) return attempt;
da der Standardwert vonT
vielleicht nichtnull
(wennT
ist ein Wert, Typ).Können Sie reduzieren Ihre Baumstruktur mit dieser Erweiterung Methode:
Verwendung:
Beachten Sie, dass dies wahrscheinlich nicht sehr schnell. Wenn Sie immer wieder benötigen, um ein Produkt zu finden, die von id haben, erstellen Sie ein Wörterbuch:
null
.First
dann, Dank verspäteter Ausführung,Flatten
nur glätten, so viel wie nötig.Ich bin nur refactoring dtb-Lösung zu machen, mehr generische. Versuchen Sie, diese Erweiterung-Methode:
Und Sie können es verwenden, wie diese:
Alternative Lösung mit der Ausbeute zu optimieren, sind die Aufzählungen benötigt.
Dann finden Sie ein Spiel, indem Sie etwas rufen wie FirstOrDefault:
Wenn Sie wollen, um "sub- "iterate" und ein Kind finden, das in einer Liste der Produkte:
Können Sie die vorhandenen
SelectMany
- Erweiterung-Methode. SelectMany kann verwendet werden, um "reduzieren" ein zwei-Ebenen-Hierarchie.Hier ist eine tolle Erklärung von SelectMany: http://team.interknowlogy.com/blogs/danhanan/archive/2008/10/10/use-linq-s-selectmany-method-to-quot-flatten-quot-collections.aspx
Ihre würde die syntax wie diese: