4

我有一个父/子 ID 列表,并希望获取给定父 ID 的所有子 ID。没有 null 父级(顶级 ID 不会显示为子 ID)。

目前,父/子 ID 被记录为列表中的 KeyValuePair,但是如果这样会更好,则可以轻松地将其更改为另一个数据结构:

List<KeyValuePair<int, int>> groups = new List<KeyValuePair<int, int>>();
groups.Add(new KeyValuePair<int,int>(parentID, childID));

例如,这里是示例父/子。父母27的孩子将是5944, 2065, 2066, 2067, 6248, 6249, 6250

Parent  Child
27      1888
1888    5943
1888    5944
5943    2064
5943    2065
5943    2066
5943    2067
2064    6248
2064    6249
2064    6250

任何帮助将不胜感激!

4

2 回答 2

6

为什么不更改类型Dictionary<int, List<int>>,其中父项是键,值(整数列表)是子项?

然后,您将使用以下命令取回子列表:

    private List<int> GetAllChildren(int parent)
    {
        List<int> children = new List<int>();
        PopulateChildren(parent, children);
        return children;
    }

    private void PopulateChildren(int parent, List<int> children)
    {
        List<int> myChildren;
        if (myitems.TryGetValue(parent, out myChildren))
        {
            children.AddRange(myChildren);
            foreach (int child in myChildren)
            {
                PopulateChildren(child, children);
            }
        }
    }

您将需要权衡性能影响,因为这会加快读取速度并减慢写入速度(大部分时间甚至没有人注意到)。

您还需要检查列表是否在字典中myitems.TryGet(...),如果没有,则需要创建它,但这是 o(1),因此实际上是即时的。

private static void AddEntry(int parent, int child)
{
    List<int> children;
    if (!myitems.TryGetValue(parent, out children))
    {
        children = new List<int>();
        myitems[parent] = children;
    }
    children.Add(child);
}
于 2012-06-26T01:18:00.500 回答
0

这很简单。只需认为您在以下数组中有列表

    List<KeyValuePair<int, int>> groups = new List<KeyValuePair<int, int>>();
    groups.Add(new KeyValuePair<int, int>(27, 1888));
    groups.Add(new KeyValuePair<int, int>(1888, 5943));
    groups.Add(new KeyValuePair<int, int>(1888, 5944));
    groups.Add(new KeyValuePair<int, int>(5943, 2064));
    groups.Add(new KeyValuePair<int, int>(5943, 2065));
    groups.Add(new KeyValuePair<int, int>(5943, 2066));
    groups.Add(new KeyValuePair<int, int>(5943, 2067));
    groups.Add(new KeyValuePair<int, int>(2064, 6248));
    groups.Add(new KeyValuePair<int, int>(2064, 6249));
    groups.Add(new KeyValuePair<int, int>(2064, 6250));
    groups.Add(new KeyValuePair<int, int>(2000, 1000));
    // Pass the 1st parameter as the parent to get all children
    List<int> childs = GetAllChild(27, groups);

您需要使用“递归函数”来动态获取孩子。只需调用以下方法即可获取父级的所有子级

public List<int> GetAllChild(int id,List<KeyValuePair<int, int>> newLst)
{
      List<int> list = new List<int>();
      for (int i = 0; i < newLst.Count; i++)
      {
            if (Convert.ToInt32(newLst[i].Key) == id)
            {
                 if (!list.Contains(Convert.ToInt32(newLst[i].Value)))
                 {
                     list.Add(Convert.ToInt32(newLst[i].Value));
                     List<int> l = GetAllChild(newLst[i].Value, newLst);
                     list.AddRange(l);
                 }
            }
       }
       return list;
}
于 2014-10-15T06:38:16.973 回答