如何在C#中使用递归创建对象并引用其父对象?

如何在C#中使用递归创建对象并引用其父对象?,c#,class,recursion,nested,C#,Class,Recursion,Nested,更新:最初的想法是嵌套这些对象,但后来我意识到,在每个对象中都有一条祖先轨迹就足够了,因此标题已经修改 我想建立一个对象集合,我可以在开发时使用它(我的想法是将它们放入MongoDB集合),但我不知道如何进行多深度操作 此场景中的对象只有名称、id(自动递增)和每个对象父对象的正斜杠分隔字符串 我已设法使初始递归工作: id祖先姓名 一, / LFHVJULCA 二, /1/ OHOEKOOFZP 三, /1/2/ PIUHBACFJV 四, /1/2/3/ PYKUFZOHXS 五, /1/2

更新:最初的想法是嵌套这些对象,但后来我意识到,在每个对象中都有一条祖先轨迹就足够了,因此标题已经修改

我想建立一个对象集合,我可以在开发时使用它(我的想法是将它们放入MongoDB集合),但我不知道如何进行多深度操作

此场景中的对象只有名称、id(自动递增)和每个对象父对象的正斜杠分隔字符串

我已设法使初始递归工作:

id祖先姓名

一, / LFHVJULCA

二, /1/ OHOEKOOFZP

三, /1/2/ PIUHBACFJV

四, /1/2/3/ PYKUFZOHXS

五, /1/2/3/4/ UJFUYENSQV

六, /1/2/3/4/5/ SHLMWCKZUJ

七, /1/2/3/4/5/6/ SFBHLQXTZL

八, /1/2/3/4/5/6/7/ 啊

九, /1/2/3/4/5/6/7/8/ MKOODIMYXC

十, /1/2/3/4/5/6/7/8/9/ 奥诺佐伊

但我想要的是拥有第二或第三层次的祖先,这样每件物品都可以有更多的后代,更新其祖先,并将其自身添加到主收藏中

这就是我被困的地方。有什么建议吗

List<Thing> things;
int count;

void Main()
{
    things = new List<Thing>();

    count = 1;
    int depth = 10;
    int thingsPerThing = 3;

    var thing = new Thing{ Ancestors = "/", id = count++, Name = "Name " + count};
    things.Add(thing);

    AddThing(depth, 0, thingsPerThing, thing);

    things.Dump();
}

public class Thing
{
  public int id{get;set;}
  public string Ancestors{ get;set;}
  public string Name{get;set;}
}

public void AddThing( int depth, int CurrentDepth, int thingsPerThing, Thing thing)
{
    CurrentDepth++;
    if( CurrentDepth < depth )
    {
        var newThing = CreateThing(thing);
        things.Add( newThing );
        AddThing( depth--, CurrentDepth, thingsPerThing, newThing);
    }

}

public Thing CreateThing(Thing thing)
{
    return new Thing{ Ancestors = thing.Ancestors + thing.id + "/", id = count++, Name = RandomString(10) };
}
列出事物;
整数计数;
void Main()
{
事物=新列表();
计数=1;
int深度=10;
int thingsPerThing=3;
var thing=newthing{祖先=“/”,id=count++,Name=“Name”+count};
事物。添加(事物);
AddThing(深度,0,thingsPerThing,thing);
事物。转储();
}
公共类事物
{
公共int id{get;set;}
公共字符串{get;set;}
公共字符串名称{get;set;}
}
public void AddThing(int-depth、int-CurrentDepth、int-thingsPerThing、Thing-Thing)
{
CurrentDepth++;
如果(当前深度<深度)
{
var newThing=CreateThing(thing);
添加(newThing);
添加内容(深度--、当前深度、内容、新内容);
}
}
公共事物创造事物(事物)
{
返回新事物{祖先=Thing.祖先+Thing.id++“/”,id=count++,Name=RandomString(10)};
}
您应该使用集合

一些实施示例:
-
-
-

要获取节点的完整路径,您可以添加一个
path
属性,该属性向后遍历到节点的根。要获得节点列表(如果需要),您必须实现一个,您可以通过多种方式来实现,使用哪种方式取决于您想要的节点顺序(有关详细信息,请参阅链接)

如果你需要一个更复杂的藏书库,你可以考虑检查一下:
-

-

如何将树结构可视化为字符串?我已经修改了标题和文本以使其更有意义。感谢Adriano的链接-我以后一定会使用它们。我修改了标题和文本,因为我意识到我所追求的不是真正的嵌套,而是向主集合添加一个对象的能力,其祖先基于递归,因此不会有任何树。