gpt4 book ai didi

javascript - C# 中的作用域、变量访问

转载 作者:行者123 更新时间:2023-11-30 21:16:27 28 4
gpt4 key购买 nike

在 Javascript 中,内部函数可以访问外部函数的变量。因此在下面的示例中,objFlag 可在 this.depthTraverse 函数中访问。

Tree.prototype.findNodeWithValue = function(valueToFind){
var objFlag = {found: false, node: null}
this.depthTraverse(function(foundNode){
if(foundNode.data === valueToFind){
objFlag.found = true;
objFlag.node = foundNode;
}
})
return objFlag
}

我正在尝试以相同的方式在 C# 中编写等效项,但意识到我遇到了一些范围界定问题。 FWIW,我不太精通使用委托(delegate)、函数或操作,所以我肯定会遗漏一些东西,但对我来说,即使我可以在 C# 中传递一个方法,它也无法访问任何外部变量它被调用的功能?有没有办法编写本质上与上述代码等效的内容,但在 C# 中?我不要求相同的输出或结果,我要求以相同的方式传入函数并改变外部变量状态。

depthTraverse 实现引用如下:

Tree.prototype.depthTraverse = function(fn){
var queue = [];
queue.push(this.root);
while(queue.length > 0){
var nodeToInspect = queue.pop();
if(nodeToInspect.leaves.length !== 0){
queue.unshift(...nodeToInspect.leaves) // breadth first
}
if(fn){
fn(nodeToInspect);
}
}
}

------ 更新 ------

我相信我根据@JonWeeder 的回答找到了解决方案。下面:

    private static Node<T> holder {get;set;}
public Node<T> FindValue(T value){
Node<T> node;
TraverseDFS(value, (el) => {
if(Comparer<T>.Equals(el.Value, value)){
holder = el;
}
});
node = holder;
holder = null;
return node == null ? null : node;
}

private void TraverseDFS(T value, Action<Node<T>> action)
{
var queue = new List<Node<T>>();
queue.Add(this.Root);
while(queue.Count > 0){
var currentNode = queue[0];
queue.RemoveAt(0);
if(currentNode.Leaves.Count > 0){
queue.AddRange(currentNode.Leaves);
}
action(currentNode);
}
}

这是我能得到的 Javascript 实现的最接近结果。尽管未经测试,IDE 并没有提示。

最佳答案

因为 C# 是一个 statically typed language ,我作为示例编写的代码看起来与您的示例有点不同,但我希望它或多或少地做同样的事情。另请查看 Action<> 和 Func<> 委托(delegate)类型文档或此 wonderful blog post .

class Node
{
public int Data { get; set; }
// omitting other Node details here
}

class ObjFlag
{
public Node Node { get; set; }
public bool Found { get; set; }
}

class Tree
{
public ObjFlag FindNodeWithValue(int valueToFind)
{
var objFlag = new ObjFlag() { Found = false, Node = null };
DepthTraverse(node =>
{
if (node.Data == valueToFind)
{
objFlag.Node = node;
objFlag.Found = true;
}
});

return objFlag;
}

public void DepthTraverse(Action<Node> action)
{
Node nodeToInspect = null;
// some logic to get the node to inspect
if (action != null)
action(nodeToInspect);
}
}

关于javascript - C# 中的作用域、变量访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45643553/

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