1
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检查可以找到,但是由于不知道它会有多少个子组件,所以只能用一个子元素操作成功。

我的问题是我想搜索整个列表的“关键”参数。即使具有此键的元素是子元素,我也想找到。

4

2 回答 2

1

你可以尝试这样的事情:

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

如果组件键等于您要查找的内容,则代码会在循环中检查。如果没有,它会检查组件是否实现了“有子”接口,如果是,则递归处理其子接口。

请注意,如果您使用的是旧版本的 C#,“else if”中的模式匹配语句将无法编译,但可以轻松地将其替换为“as”强制转换并检查“not null”。

于 2019-07-25T07:10:48.023 回答
0
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;
        }
于 2019-07-25T07:29:06.870 回答