3 回答

TA貢獻(xiàn)1783條經(jīng)驗(yàn) 獲得超4個(gè)贊
這需要遞歸是一個(gè)誤解。這將需要一個(gè)堆?;蜿?duì)列和最簡(jiǎn)單的方法是使用遞歸來實(shí)現(xiàn)它。為了完整起見,我將提供一個(gè)非遞歸答案。
static IEnumerable<Node> Descendants(this Node root)
{
var nodes = new Stack<Node>(new[] {root});
while (nodes.Any())
{
Node node = nodes.Pop();
yield return node;
foreach (var n in node.Children) nodes.Push(n);
}
}
例如,使用以下表達(dá)式來使用它:
root.Descendants().Where(node => node.Key == SomeSpecialKey)

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超10個(gè)贊
如果您想要維護(hù)類似于Linq的語法,則可以使用一種方法來獲取所有后代(子代+孩子的子代等)。
static class NodeExtensions
{
public static IEnumerable<Node> Descendants(this Node node)
{
return node.Children.Concat(node.Children.SelectMany(n => n.Descendants()));
}
}
然后,可以像其他任何查詢一樣使用where或first或其他查詢?cè)摽擅杜e的對(duì)象。

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超8個(gè)贊
用Linq搜索對(duì)象樹
public static class TreeToEnumerableEx
{
public static IEnumerable<T> AsDepthFirstEnumerable<T>(this T head, Func<T, IEnumerable<T>> childrenFunc)
{
yield return head;
foreach (var node in childrenFunc(head))
{
foreach (var child in AsDepthFirstEnumerable(node, childrenFunc))
{
yield return child;
}
}
}
public static IEnumerable<T> AsBreadthFirstEnumerable<T>(this T head, Func<T, IEnumerable<T>> childrenFunc)
{
yield return head;
var last = head;
foreach (var node in AsBreadthFirstEnumerable(head, childrenFunc))
{
foreach (var child in childrenFunc(node))
{
yield return child;
last = child;
}
if (last.Equals(node)) yield break;
}
}
}
- 3 回答
- 0 關(guān)注
- 446 瀏覽
添加回答
舉報(bào)