如何在 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;
}
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;
}