我有一个父/子ID列表,并希望获得给定父ID的所有子ID。没有空父项(顶级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
非常感谢任何帮助!
答案 0 :(得分:5)
为什么不更改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);
}
答案 1 :(得分: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;
}