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 }