C# 改进具有相关父ID的项的递归计数
目前我的数据看起来有点像这样C# 改进具有相关父ID的项的递归计数,c#,recursion,count,C#,Recursion,Count,目前我的数据看起来有点像这样 ID PARENT ID 1 0 2 1 3 2 4 2 5 3 6 5 我想计算与一位家长相关的项目 e、 对于ID 1的g计数返回5,因为 ID 2 has ID 1 as parent ID 3 has ID 2 as parent, which has ID 1 as parent ID 4 has ID 2 as parent, which has ID 1 as par
ID PARENT ID
1 0
2 1
3 2
4 2
5 3
6 5
我想计算与一位家长相关的项目
e、 对于ID 1的g计数返回5,因为
ID 2 has ID 1 as parent
ID 3 has ID 2 as parent, which has ID 1 as parent
ID 4 has ID 2 as parent, which has ID 1 as parent
ID 5 has ID 3 as parent, which has ID 2 as parent, which has ID 1 as parent
ID 6 has...
我用简单的递归解决了这个问题
private int Count(Entry entry)
{
int cnt = 0;
foreach (Entry foundEntry in AllEntries.Where(x => x.ParentID == entry.ID)) {
cnt++;
cnt += Count(found);
}
return cnt;
}
// somewhere in the code
foreach (Entry currentEntry in AllEntries.Where(x => x.ParentID == 1).ToList()) {
cnt++;
cnt += Count(currentEntry );
}
还有其他不使用递归的方法吗?(LINQ,Stack..)如果我正确理解了您的问题,您可以遍历
AllEntries
,并在哈希集中跟踪相关的父项:
如果我正确理解了您的问题,您可以遍历AllEntries
,并在HashSet
中跟踪相关的父项:
这个问题不需要递归。您要搜索ID=1的父ID列。除非要查找1的所有子代,否则需要递归。如果你在寻找后代,那么你需要使用递归或Push/Pop方法。当然你需要递归,否则你想如何找到所有的子代和孙辈?@jdweng我想你误解了我的问题,我需要递归,因为我想根据变化的变量计算项目。否则,我可以使用.Count(…)
更改与这个问题有什么关系?要么只需要子对象(不需要递归),要么需要子对象(需要递归)。不更改ref表示我需要第一级子对象=无递归。但正如我在问题中所说,我的目标需要递归。这个问题不需要递归。您要搜索ID=1的父ID列。除非要查找1的所有子代,否则需要递归。如果你在寻找后代,那么你需要使用递归或Push/Pop方法。当然你需要递归,否则你想如何找到所有的子代和孙辈?@jdweng我想你误解了我的问题,我需要递归,因为我想根据变化的变量计算项目。否则,我可以使用.Count(…)
更改与这个问题有什么关系?要么只需要子对象(不需要递归),要么需要子对象(需要递归)。不更改ref表示我需要第一级子对象=无递归。但正如我在问题中所说,我的目标需要递归。你说“可以改变”是什么意思?我猜在调用方法和返回方法之间没有任何变化。请提供一些我的代码返回错误答案的示例数据。或者自己修改代码。你应该知道如何用迭代而不是递归来解决这个问题。对不起,我的错!我没有使用正确的数据进行测试。您的解决方案非常有效!“可以改变”是什么意思?我猜在调用方法和返回方法之间没有任何变化。请提供一些我的代码返回错误答案的示例数据。或者自己修改代码。你应该知道如何用迭代而不是递归来解决这个问题。对不起,我的错!我没有使用正确的数据进行测试。您的解决方案非常有效!
private int Count(Entry entry)
{
HashSet<int> parentIds = new HashSet<int>();
parentIds.Add(entry.ID);
int count = 0;
foreach (Entry e in AllEntries.OrderBy(x => x.ParentID))
{
if (parentIds.Contains(e.ParentID))
{
count++;
parentIds.Add(e.ID);
}
}
return count;
}
int count = Count(AllEntries[0]) //where AllEntries[0] = new Entry(){ ID = 1, ParentID = 0 }