Soweit ich weiß, kann man recusive Linq nicht haben, weil rekursive lambdas mit aus der Box nicht möglich ist.
Die originellste Antwort, die ich geben kann, basiert auf einem rekursiven Lambda-Ausdruck, der auf einem wiederverwendbaren Fixpunktoperator basiert. Sie werden die meisten Linq-Mechanismen finden. Aber ich fürchte, der Fixpoint-Teil ist der Grund, warum es keine reine Linq-Antwort gibt.
public static class FixPoint
{
// Reusable fixpoint operator
public static Func<T, TResult> Fix<T, TResult>(Func<Func<T, TResult>, Func<T, TResult>> f)
{
return t => f(Fix<T, TResult>(f))(t);
}
}
public class Element
{
public List<Element> element;
public int CalculateMaxDepth()
{
return FixPoint.Fix<List<Element>, int>(
// recursive lambda
f =>
listElement => listElement == null || listElement.Count == 0
? 0
: 1 + listElement.Select(e => f(e.element)).Max())
(this.element);
}
[Test]
public void myTest()
{
var elt = new Element() { element = new List<Element> { new Element() { element = new List<Element> { new Element() { element = new List<Element> { new Element() } } } } } };
Assert.AreEqual(3, elt.CalculateMaxDepth());
}
}
Ich würde die rekursive Methode verwenden, um die Anzahl der Elemente in der Struktur zu zählen. Aber es wäre schön, andere Ideen zu hören. Gute Frage. – Maris
Was meinst du mit der Länge des Baumes? Die maximale Tiefe? Die Gesamtzahl der Artikel? – Rawling
Die maximale Tiefe – kosnkov