C# Can';t从方法内部的foreach循环获取返回值

C# Can';t从方法内部的foreach循环获取返回值,c#,oop,C#,Oop,我在C#中有一个方法,它在节点列表arg中找到一个名为node_name的节点,并返回找到的节点的值(假设只有一个节点有这样的名称)。如果没有找到这样的节点,它应该返回一个空字符串 public string get_nodes_value(XmlNodeList arg, string node_name) { foreach (XmlNode arg_node in arg) { if (!arg_node.HasChildNodes) {

我在C#中有一个方法,它在节点列表
arg
中找到一个名为
node_name
的节点,并返回找到的节点的值(假设只有一个节点有这样的名称)。如果没有找到这样的节点,它应该返回一个空字符串

public string get_nodes_value(XmlNodeList arg, string node_name)
{
    foreach (XmlNode arg_node in arg)
    {
        if (!arg_node.HasChildNodes)
        {
            if (String.Compare(arg_node.ParentNode.Name, node_name) == 0)
            {
                return arg_node.Value;
            }
        }
        else
        {
            get_nodes_value(arg_node.ChildNodes, node_name);
        }
    }
    return "";
}

上面的代码总是返回一个空字符串。我错过了什么?

好吧,您忽略了
else
块中递归调用的返回值。在某些情况下,你是不是打算从那里回来?我猜你想要这样的东西(同时修复一些惯例上的奇怪之处):


那么,您将忽略
else
块中递归调用的返回值。在某些情况下,你是不是打算从那里回来?我猜你想要这样的东西(同时修复一些惯例上的奇怪之处):


无论哪个递归调用找到您的节点,都将返回它,但除非它是顶层,否则该值将被忽略。你可能想做一些事情,比如:

    else
    {
        string value = get_nodes_value(arg_node.ChildNodes, node_name);
        if (value != "")
            return value;
    }

无论哪个递归调用找到您的节点,都将返回它,但除非它是顶层,否则该值将被忽略。你可能想做一些事情,比如:

    else
    {
        string value = get_nodes_value(arg_node.ChildNodes, node_name);
        if (value != "")
            return value;
    }

找到答案的最简单方法是在设置“手表”的同时逐步检查代码在
arg\u node.ParentNode.Name
node\u Name
上,您将看到它将在哪些分支中结束,并且您可以找到它为什么没有到达您认为它会到达的地方。

找到它的最简单方法是在设置“监视”时逐步查看代码在
arg\u node.ParentNode.Name
node\u Name
上,然后您将看到它将在哪些分支中结束,并且您可以找到它为什么没有到达您认为它会到达的地方。

我认为当您搜索的节点是一片叶子时,您有一个bug。您总是会返回一个空字符串。@Petar:我假设是在给定名称的元素中搜索文本节点。我只是继续原来的代码。谢谢你的快速回复:)这就是我错过的。我想当你搜索的节点是一个叶子时,你有一个bug。您总是会返回一个空字符串。@Petar:我假设是在给定名称的元素中搜索文本节点。我只是继续原来的代码。谢谢你的快速回复:)这就是我错过的。也许你需要一个不区分大小写的搜索?尝试将compare函数与ignorecase枚举一起使用。您可能希望签出Linq to SQL。您可以将其作为一个Linq查询来完成。当我切换到它之后,每当我看到有人使用旧的对象模型时,我都想哭。也许你需要一个不区分大小写的搜索?尝试将compare函数与ignorecase枚举一起使用。您可能希望签出Linq to SQL。您可以将其作为一个Linq查询来完成。当我切换到它,我想哭,每当我看到有人使用旧的对象模型。