2

私は c# と List コレクションを使用して値をロードしました。それが完了したら、それらを再帰的に読み取ろうとしていますが、これを達成できない方法もあります。

以下は私のメインコードです。

    private static void Main(string[] args)
            {
                var node = new Node
                    {
                        Name = "N1",
                        Nodes =
                            new List<Node>
                                {
                                    new Node { Name = "N1a" },
                                    new Node { Name = "N1b", Nodes = new List<Node> { new Node { Name = "N1B1" } } },
                                    new Node
                                        {
                                            Name = "N1c",
                                            Nodes =
                                                new List<Node> { new Node { Name = "N1C1", Nodes = new List<Node> {new Node{Name = "N1C1A"} } } }
                                        }
                                }
                    };
                GetNodes( node );
                Console.ReadLine();
            }

 public class Node
        {
            public string Name { get; set; }

            public IList<Node> Nodes { get; set; }
        }

関数呼び出しは次のとおりです

public static IEnumerable<Node> GetNodes(Node node)
        {
            if (node == null)
            {
                return null;
            }

            Console.WriteLine(node.Name);

            foreach (var n in node.Nodes)
            {
                return GetNodes(n);
            }

            return null;
        }
    }  

誰でも再帰関数を修正するのを手伝ってくれませんか?

4

4 に答える 4

6

すべてのノードの名前を出力したいだけの場合は、

public static void GetNodes(Node node)
{
    if (node == null)
    {
        return;
    }
    Console.WriteLine(node.Name);
    foreach (var n in node.Nodes)
    {
        GetNodes(n);
    }
}

木を平らにしたい場合は、

public static IEnumerable<Node> GetNodes(Node node)
{
    if (node == null)
    {
        yield break;
    }
    yield return node;
    foreach (var n in node.Nodes)
    {
        foreach(var innerN in GetNodes(n))
        {
            yield return innerN;
        }
    }
}
于 2012-09-27T11:29:03.640 に答える
2
public static IEnumerable<Node> GetNodes(Node node)
{
    if (node == null) return null;

    var nodes = new List<Node>();
    nodes.Add(node);

    Console.WriteLine(node.Name);

    if (node.Nodes != null)
    {
        foreach (var n in node.Nodes)
        {
            nodes.AddRange(GetNodes(n));
        }
    }

    return nodes;
}}
于 2012-09-27T11:58:32.873 に答える
1

メソッドはすべてnullを返すか、それ自体を呼び出してからnullを返すか、それ自体を呼び出します.....したがって、1日の終わりにnullを返すか、終了しません。値をセラライズしたい場合は、コンソールに書き込むのと同じポイントでリストに書き込むことができます。

public static void GetNodes(Node node, List<Node> output)
{
    if (node == null)
        return;

    output.Add(node);
    Console.WriteLine(node.Name);

    foreach (var n in node.Nodes)
    {
        GetNodes(n, output);
    }
}
于 2012-09-27T11:28:53.037 に答える
0

最初の反復で、ループ内のメソッドからすぐに戻ります。他の反復​​は実行されません。

于 2012-09-27T11:29:34.913 に答える