2017-10-05 2 views
-5

Ich brauche einen LINQ-Ausdruck, bei dem der Ausdruck davon abhängt, wie tief der erwartete Knoten in der Hierarchie ist.Eine Zeichenfolge in einen linq-Ausdruck einfügen?

So verwende ich Concat auf eine Zeichenfolge wie folgt aus:

var parString = string.Concat(Enumerable.Repeat(".SelectMany(f => f.level)", level)); 

so, wenn seine vier Ebenen tief ich die Zeichenfolge erhalten:

string1 = ".SelectMany(f => f.level).SelectMany(f => f.level).SelectMany(f => f.level).SelectMany(f => f.level)" 

ich dann diese Zeichenfolge in einer LINQ-Ausdruck verwenden möchten Beispiel:

List + string1 + .FirstOrDefault(.......); 

Ist das überhaupt möglich? Wie kann ich es tun?

+2

Zu viel Pseudocode, ich verstehe es nicht. Warum brauchst du die Saiten dort? Was ist Ihre Quelle, was sind die Variablen, was ist das erwartete Ergebnis? –

+3

Warum würdest du das überhaupt in eine Saite stecken? – nvoigt

+0

Obwohl ich unten eine Antwort gegeben habe, glaube ich, was du meintest, bitte klär dich, was du versuchst zu tun und warum Strings zu verwenden? Verwenden Sie MoreLinq oder etwas Ähnliches? –

Antwort

4

Verwendung einer for-Schleife, um zu bestimmen, wie oft .SelectMany zu nennen:

var query = List; 
for(int depth = 4; depth > 0; depth--) 
{ 
    query = query.SelectMany(f => f.level); 
} 
// Materialize query with `FirstOrDefault` or anything you need 

Beachten Sie, dass zur Zeit, wenn Sie die maximale Tiefe erreichen und noch weiterhin erhalten Sie eine Ausnahme erhalten. Um das zu lösen, können Sie eine if-Anweisung hinzufügen, um zu überprüfen, ob f.level nicht null oder nicht leer ist, abhängig von Ihrer Logik. Etwas wie:

for(int depth = 4; depth > 0; depth--) 
{ 
    query = query.SelectMany(f => f.level ?? Enumerable.Empty<YourType>()); 
} 
+0

Ok ich werde versuchen, mein Problem weiter zu beschreiben. Ich möchte ein Objekt aus einer bestimmten Tiefe bekommen. Meine Sammlung, von der ich dieses Objekt erhalten muss, ist eine Sammlung, die aus Objekten besteht, die aus Objekten usw. bestehen. Wenn ich SelectMany nur einmal für die Sammlung auswähle, kann ich nur zu den Objekten auf der zweiten Ebene gelangen. Wenn ich SelectMany(). SelectMany (zweimal), kann ich auf die dritte Ebene gelangen. Also muss ich eine allgemeine Lösung haben, die für alle Ebenen funktioniert und ich weiß wirklich nicht, wie man macht – coder2017

+0

@ coder2017 - dann Bitte aktualisieren Sie die Frage mit dieser Erklärung und die obige Lösung wird den Trick für Sie tun –

Verwandte Themen