我用这个类创建了一棵树.

class Node
{
    public string Key { get; }
    public List<Node> Children { get; }
}

我要在所有子元素及其所有子元素中搜索,以获得符合条件的:

node.Key == SomeSpecialKey

我如何实现它?

推荐答案

这是一种误解,认为这需要递归.它需要一个堆栈或队列,最简单的方法是使用递归实现它.为了完整起见,我将提供一个非递归的答案.

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);
    }
}

例如,使用以下表达式:

root.Descendants().Where(node => node.Key == SomeSpecialKey)

.net相关问答推荐

使用.NET 8时无法识别运行标识符

与 Datagrid 的 SelectedItem 链接时的 WPF RadioButton 绑定问题

在接口内部声明 IEnumerable 而在具体类中声明 IList

使用 Task.WhenAll 但需要跟踪每个单独的 Task 的成功

在.NET C#中截断整个单词的字符串

如何使用 Moq 为不同的参数设置两次方法

如何将浮点数向上舍入到 C# 中最近的 int?

我应该从 .NET 中的 Exception 或 ApplicationException 派生自定义异常吗?

使用只读属性或方法?

如何创建只读依赖属性?

msbuild,定义条件编译符号

Mono 是树莓派

.NET 中是否有可序列化的通用键/值对类?

如何在 WebBrowser 控件中注入 Javascript?

如何从 .NET 读取 PEM RSA 私钥

获取磁盘上文件的大小

在 .NET Core 中在 MVC 之外使用 Razor

嵌套的 Try/Catch 块是个坏主意吗?

使用 C# vs F# 或 F# vs C# 有什么好处?

嵌套捕获组如何在正则表达式中编号?