我如何在C#中使用递归创建对象,引用它们的父对象?

时间:2012-03-15 09:35:47

标签: c# class recursion nested

更新:最初的想法是嵌套对象,但后来我意识到在每个对象中都有一个祖先痕迹就足够了,所以标题已被修改。

我想建立一个对象集合,我可以在开发时使用它们(想法是将它们放入MongoDB集合中)但是无法弄清楚如何进行多个深度。

此方案的对象只有一个名称,一个id(自动递增),以及每个对象父项的正斜杠分隔字符串。

我设法让初始递归工作:

id祖先姓名

1  /  LFHVJULLCA

2  / 1 /  OHOEKOOFZP

3  / 1/2 /  PIUHBACFJV

4  / 1/2/3 /  PYKUFZOHXS

5  / 1/2/3/4 /  UJFUYENSQV

6  / 1/2/3/4/5 /  SHLMWCKZUJ

7  / 1/2/3/4/5/6 /  SFBHLQXTZL

8  / 1/2/3/4/5/6/7 /  AHHHUGDZIX

9  / 1/2/3/4/5/6/7/8 /  MKOODIMYXC

10  / 1/2/3/4/5/6/7/8/9 /  OONOZOHYJH

但我想要的是拥有第二级或第三级的祖先,这样每个项目都可以拥有更多的子项,更新其祖先,并将自己添加到主集合中。

这就是我被困住的地方。有什么指示吗?

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) };
}

1 个答案:

答案 0 :(得分:1)

您应该使用Tree集合。

实施的一些例子:
  - An Extensive Examination of Data Structures Using C# 2.0 (MSDN)
  - Implementing a Non-Binary Tree in C# (Dan Vanderboom's blog)
  - A Generic Tree Collection (CodeProject)

要获取节点的完整路径,您可以添加一个Path属性,该属性向后走到它的根目录。要获取节点列表(如果需要),您必须实现tree traversal algorithm,您可以使用多种方式执行此操作,使用哪种方式取决于您希望节点的顺序(有关详细信息,请参阅链接。

如果您需要更复杂的收藏库,您可以考虑检查这些:
  - The C5 Generic Collection Library
  - Wintellect's Power Collection