C#树数据结构,生成输出

C#树数据结构,生成输出,c#,data-structures,recursion,tree,C#,Data Structures,Recursion,Tree,我通过类创建了自己的树数据结构。 现在我只能做一些基本的事情了。我需要根据列表中的数据将输出制表符分隔的文件设置为 我认为递归是唯一的方法 树是N-树,输出的第一行作为标题,其他行是值 树: 味精(MainTreeNode) MainParam(必须有属性名称,不必有属性值) 子参数1(必须有属性名称,必须有属性值) 子参数2(必须有属性名称,不必有属性值) SubSubParam2.1(必须有属性名称,必须有属性值) 等等 或: 信息:姓名 Param1:ValueV1(值必须为

我通过类创建了自己的树数据结构。 现在我只能做一些基本的事情了。我需要根据列表中的数据将输出制表符分隔的文件设置为

我认为递归是唯一的方法

树是N-树,输出的第一行作为标题,其他行是值

树:

  • 味精(MainTreeNode)
    • MainParam(必须有属性名称,不必有属性值)
      • 子参数1(必须有属性名称,必须有属性值)
      • 子参数2(必须有属性名称,不必有属性值)
        • SubSubParam2.1(必须有属性名称,必须有属性值)
          等等
  • 或:

  • 信息:姓名
    • Param1:ValueV1(值必须为,因为它没有子项)
    • 参数2
      • 参数2.1:ValueV2
      • 参数2.2:值
        • 参数2.2.1:ValueV3
        • 参数2.2.2:ValueV4…等
  • 输出必须如下所示(第一行是标题):

    所以我可能需要头和值的列表,但我不知道如何以递归方式(或任何其他方式)实现它

    一些未完成的代码:

    public void PrintToTabFile(List<Message> messages, List<string> parameters)
        {
            foreach (string s in parameters)
            {
                using (StreamWriter streamWriter = new StreamWriter(@"C:\temp\" + s + ".xls"))
                { 
                    streamWriter.Write("No.\tMsgName\tMsgData1\tMsgData2\tMsgData3");
                    var msg = messages.Where(x => x.Parameters.Where(p => p.ParameterName == s).Count() == 1);
    
                    List<string> headers = new List<string>();
                    List<string> values= new List<string>();
                    //... Stuck!!!
                }
            }
        }
    
        private void Recursion(Parameter parameter, List<string> headers, List<string> values)
        {
            if (parameter.SubParameters.Count == 0)
            {
                int index = headers.IndexOf(parameter.ParameterName);
                values[index] = parameter.ParameterValue;
            }
            else
            {
                foreach (Parameter p in parameter.SubParameters)
                {
                    Recursion(p, headers, values);
                    //and Stuck Probably here or before recursion call
                }
            }
        }
    
    public void PrintToTabFile(列出消息,列出参数)
    {
    foreach(参数中的字符串s)
    {
    使用(StreamWriter StreamWriter=newstreamwriter(@“C:\temp\”+s+“.xls”))
    { 
    streamWriter.Write(“No.\tMsgName\tMsgData1\tMsgData2\tMsgData3”);
    var msg=messages.Where(x=>x.Parameters.Where(p=>p.ParameterName==s.Count()==1);
    列表标题=新列表();
    列表值=新列表();
    //…卡住了!!!
    }
    }
    }
    私有无效递归(参数、列表标题、列表值)
    {
    if(parameter.SubParameters.Count==0)
    {
    int index=headers.IndexOf(parameter.ParameterName);
    值[索引]=parameter.ParameterValue;
    }
    其他的
    {
    foreach(参数子参数中的参数p)
    {
    递归(p、头、值);
    //并且可能卡在这里或递归调用之前
    }
    }
    }
    
    我不会说我真的知道你在问什么,但我还是要试一试。在我看来,这似乎是一个非常基本的递归,可以在执行时遍历带有一些奇怪输出的树结构。 试着这样做: 1.为所有类创建一个名为INode的接口。这个接口应该包含一些典型的东西,比如列表子项、INode父项等。 2.让所有类实现这个接口(或者让它们继承一个实现这个接口的基类) 3.现在从基本类开始,使用Children属性递归遍历所有子类并生成输出

    我想这应该能奏效。(对不起,这里没有VS来提供一些真实的代码)

    顺便说一句:你可能会在stackoverflow上找到很多关于这个的帖子

    public void PrintToTabFile(List<Message> messages, List<string> parameters)
        {
            foreach (string s in parameters)
            {
                using (StreamWriter streamWriter = new StreamWriter(@"C:\temp\" + s + ".xls"))
                { 
                    streamWriter.Write("No.\tMsgName\tMsgData1\tMsgData2\tMsgData3");
                    var msg = messages.Where(x => x.Parameters.Where(p => p.ParameterName == s).Count() == 1);
    
                    List<string> headers = new List<string>();
                    List<string> values= new List<string>();
                    //... Stuck!!!
                }
            }
        }
    
        private void Recursion(Parameter parameter, List<string> headers, List<string> values)
        {
            if (parameter.SubParameters.Count == 0)
            {
                int index = headers.IndexOf(parameter.ParameterName);
                values[index] = parameter.ParameterValue;
            }
            else
            {
                foreach (Parameter p in parameter.SubParameters)
                {
                    Recursion(p, headers, values);
                    //and Stuck Probably here or before recursion call
                }
            }
        }