C# 填充嵌套的ObservableCollection

C# 填充嵌套的ObservableCollection,c#,wcf,generic-collections,C#,Wcf,Generic Collections,我有一节课 public class Owner { public int OwnerId{get; set;} public int OwnerName{get; set;} public ObservableCollection<Owner> SubOwner{get; set;} } 我需要用上述数据(如树结构)填充变量ObservableCollection Owner。请帮助我。如果我理解正确,您希望了解如何从数据库中获取的所有者ID和所有者父ID构建非二叉树。要做到这一

我有一节课

public class Owner
{
public int OwnerId{get; set;}
public int OwnerName{get; set;}
public ObservableCollection<Owner> SubOwner{get; set;}
}

我需要用上述数据(如树结构)填充变量ObservableCollection Owner。请帮助我。

如果我理解正确,您希望了解如何从数据库中获取的所有者ID和所有者父ID构建非二叉树。要做到这一点,您需要跟踪树根(所有者的一个实例)。然后添加一个API,向树中添加一个只在树根上调用的新所有者。此API递归遍历树,直到找到要添加到的正确父级。您还可以排列树,使其比搜索每个节点都要快

下面是一个关于在C#中创建树的好方法

然而,在您上面的简单示例中,我不推荐树。我建议将parentID添加到Owner类中,然后使用一个简单的SortedList。然后,您可以很容易地找到一个ID,获取它的父项,并像遍历一棵树一样进行遍历。例如:

void WalkUpTree(SortedList<int, Owner> tree, Owner node)
{
    // (do something with node)

    // process parent
    if (node.parentID == 0 || tree.ContainsKey(node.parentID) == false)
        return;    // No parent
    WalkUpTree(tree, tree[node.parentID]);
}
void WalkUpTree(分类列表树,所有者节点)
{
//(对节点执行某些操作)
//进程父进程
if(node.parentID==0 | | tree.ContainsKey(node.parentID)==false)
return;//没有父项
WalkUpTree(树,树[node.parentID]);
}
如果要向下遍历树,请保留根节点的索引,然后创建第二个SortedList,其中int是父ID而不是ID。然后,WalkUpTree使用第二个SortedList变为WalkDownTree

void WalkUpTree(SortedList<int, Owner> tree, Owner node)
{
    // (do something with node)

    // process parent
    if (node.parentID == 0 || tree.ContainsKey(node.parentID) == false)
        return;    // No parent
    WalkUpTree(tree, tree[node.parentID]);
}