gpt4 book ai didi

c# - 在递归调用中跟踪 parent

转载 作者:行者123 更新时间:2023-11-30 14:55:36 25 4
gpt4 key购买 nike

我试图在递归调用中跟踪 parent ,并标记正确发生的父子关系。

有 4 个类(不要介意名称,这是一个示例的 dummycode):

  1. child 区 block
  2. 终于有了 child
  3. child 一次性用品

所有 3 个子类都继承自一个抽象类:Child。

Root 显然是拥有所有 child 的顶级类,Root 没有父类。但是,在某种程度上,其他类也没有。 Root 有 child ,每个 child 都有 child ;但反之则不然。 ChildBlock(和所有其他)没有存储父级,只有一个子级列表。见代码:

internal abstract class Child
{
public string name;
public List<Child> children;

public Child()
{
name = "Child";
children = new List<Child>();
}

public virtual void AddChild(Child child)
{
children.Add(child);
}
}

internal class ChildFinally : Child
{
public ChildFinally(string level)
{
name = level + ": ChildFinally";
children = new List<Child>();
}
}

假设您有一个 Root(级别 1)和一个 child :ChildBlock(级别 2)。 ChildBlock 本身有两个 child :ChildFinally(级别 3)和 ChildBlock(级别 3)。 ChildFinally(级别 3)和 ChildBlock(级别 3)都有一个 child :ChildDisposable(级别 4)。

所以以分层的方式(我给它们涂上颜色以更准确地显示级别): enter image description here

我想要实现的是:我想知道 ChildDisposable(level 4) 是否有父级,在他之上的任何级别,类型为 ChildFinally.

这里的问题是 ChildDisposable 不知道它的父级,但父级知道他的子级(通过子级列表)。

现在我正在递归调用中遍历每个子列表:

private static void DisplayChildren(Child child)
{
foreach (Child c in child.children)
{
Console.WriteLine(c.name);
DisplayChildren(c);
}
}

这个递归调用必须保持这种状态。另外,我不能让 children 知道他们的 parent 。

有什么方法可以让我跟踪 ChildDisposable 类型的子项是否具有 ChildFinally 类型的父项(在任何级别)?

编辑:如果需要,我可以提供完整的(可复制的)虚拟代码。

最佳答案

根据我们所知道的情况很难判断,但我想我可以猜出一点。

无论如何,如果我是对的,你将以某种方式行走你的树,所以我的建议是在你行走<时记住某种路径信息/em> 你的树(应该是微不足道的 - 它只是你的 walker 的另一个论点) - 你可以在那里轻松地存储像最后一个 ChildFinally

这将是你的例子:

private static void DisplayChildren(Child child)
{
DisplayChildren(child, new []{child});
}

private static void DisplayChildren(Child child, Child[] path)
{
foreach (Child c in child.children)
{
Console.WriteLine(c.name);
var newPath = new List<Child>(path);
newPath.Add(c);
DisplayChildren(c, newPath.ToArray());
}
}

当然我不知道真正需要什么所以这个例子只给你当前 child (包括它)的路径 - 应该很容易找到你需要的东西:

static bool HasFinalParent(Child[] path)
{
return path.Any(c => c is ChildFinally);
}

或更简单(只记住父级):

private static void DisplayChildren(Child child)
{
DisplayChildren(child, null);
}

private static void DisplayChildren(Child child, ChildFinally lastFinalParent)
{
if (child is ChildFinally)
lastFinalParent = (ChildFinally)child;

foreach (Child c in child.children)
{
Console.WriteLine(c.name);
DisplayChildren(c, lastFinalParent);
}
}

关于c# - 在递归调用中跟踪 parent ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25031569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com