如何在 LINQ 或其他方式中搜索树结构

How can I search the tree structure in LINQ or some other way

public interface IComponent
{
    Guid Key { get; set; }
}
 public interface ICanHaveChildElement
{
    List<IComponent> ChildElement {get;set;}
}
public class BaseComponent : IComponent
{
    public Guid Key { get; set; }
}
public class TextBox : BaseComponent, IComponent
{

}
public class Radiobutton : BaseComponent, IComponent
{

}
public class Table : BaseComponent, IComponent, ICanHaveChildElement
{
    public List<IComponent> ChildElement { get; set; }
}
public class TestService
{
    public void Search(Guid key)
    {
        List<IComponent> components = new List<IComponent>();
        var element = components.FirstOrDefault(p => p.Key == key);
    }
}

您好,

当我在现有代码块中没有子组件的组件(文本框、收音机等)中搜索时,我可以找到该组件。 但是,我找不到具有子组件(例如表)的组件。用if查也能找​​到,但不知道它有多少个子元素,只能用一个子元素运算成功。

我的问题是 "key" 参数我想搜索整个列表。我想找即使有这个key的元素是子元素

您可以尝试这样的操作:

public IComponent Search(Guid key, IEnumerable<IComponent> components)
{
    foreach (var c in components)
    {
        if (c.Key == key)
        {
            return c;
        }
        else if (c is ICanHaveChildElement withChildren)
        {
            return Search(key, withChildren.ChildElement);
        }
    }

    return null;
}

代码在循环中检查 components 键是否等于您要查找的内容。如果没有,它会检查组件是否实现了 "has children" 接口,如果是 - 递归地处理它的子接口。

请注意,如果您使用的是旧版本的 C#,"else if" 中的模式匹配语句将无法编译,但可以很容易地用 "as" 强制转换和检查 "not null".

public IComponent GetComponentByKey(Guid key, List<IComponent> components)
        {
            foreach (var c in components)
            {
                if (c.Key.Equals(key)) return c;
                else if (c is ICanHaveChildElement)
                {
                    return GetComponentByKey(key, (c as ICanHaveChildElement).ChildElement);
                }
            }
            return null;
        }