gpt4 book ai didi

c# - C# 中自定义委托(delegate)的示例用法

转载 作者:太空宇宙 更新时间:2023-11-03 22:17:03 25 4
gpt4 key购买 nike

我找到了 this关于 C# 中树实现的问题。我对委托(delegate)一无所知,我想知道如何使用以下代码来实现树。另外,跟踪父节点的最有效方法是什么?

delegate void TreeVisitor<T>(T nodeData);

class NTree<T>
{
T data;
LinkedList<NTree<T>> children;

public NTree(T data)
{
this.data = data;
children = new LinkedList<NTree<T>>();
}

public void addChild(T data)
{
children.AddFirst(new NTree<T>(data));
}

public NTree<T> getChild(int i)
{
foreach (NTree<T> n in children)
if (--i == 0) return n;
return null;
}

public void traverse(NTree<T> node, TreeVisitor<T> visitor)
{
visitor(node.data);
foreach (NTree<T> kid in node.children)
traverse(kid, visitor);
}
}

最佳答案

A delegate基本上可以让您谈论满足某些条件的任意函数,而不必确切地知道您在谈论什么函数。

考虑以下用于遍历树并对每个元素执行操作的代码:

void DoSomethingToAllNodes(NTree<T> node)
{
DoSomething(node);
foreach (var child in node.Children)
DoSomethingToAllNodes(child);
}

它可以工作,但是非常不灵活。我们必须为要在节点上执行的每个不同操作重新实现该方法:

void DoSomethingElseToAllNodes(NTree<T> node)
{
DoSomethingElse(node);
foreach (var child in node.Children)
DoSomethingElseToAllNodes(child);
}

相反,我们可以声明一个委托(delegate)来表示“任何采用一个 NTree<T> 作为参数且不返回任何内容的方法”,然后我们可以接受一个满足该要求的方法作为参数。然后我们可以实现一个 Traverse处理每一种可能性的方法,而不必为每个不同的操作重新实现它。

关于c# - C# 中自定义委托(delegate)的示例用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4709331/

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