更新:最初的想法是嵌套对象,但后来我意识到在每个对象中都有一个祖先痕迹就足够了,所以标题已被修改。
我想建立一个对象集合,我可以在开发时使用它们(想法是将它们放入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) };
}
答案 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