C# StackoverflowException递归和执行缓慢

C# StackoverflowException递归和执行缓慢,c#,.net,recursion,C#,.net,Recursion,我有这个密码 private static void Count(List<DataRowSet> rows, int id, ref int count) { foreach (DataRowSet row in rows) { if (row.parentId == id) { count++; Count(rows, row.Id, ref count); } } } 我想计算列

我有这个密码

private static void Count(List<DataRowSet> rows, int id, ref int count)
{
    foreach (DataRowSet row in rows) {
        if (row.parentId == id) {
            count++;

            Count(rows, row.Id, ref count);
        }
    }
}
我想计算
列表
中具有特定id的每个子项

Count(dataList, 1, ref cnt);
这是可行的,但一旦我在
dataList
中有超过8000个条目,就会发生堆栈溢出异常。代码也很慢,查找所有条目大约需要1.5秒


我该怎么做才能解决这个问题?

由于递归太深而发生
StackOverflowException
。它可以正常工作到8000,上面的所有内容对堆栈来说都太多了。 您可以通过使用
堆栈
并将项推入堆栈而不是递归调用函数来解决此问题

查看您的
DataRowSet
类,它似乎是一个简单的列表,因此有一个简单的方法可以通过使用
ILookup
来提高性能。这样,您就可以使用该键查找任何相关项,而不是一次又一次地迭代列表


首先,您必须推送堆栈上的顶级项。可以这样做

Stack Stack=新堆栈(
其中(x=>x.Id==Id));
使用
dataRows.ToLookup
,您可以根据条目的
ParentId
对条目进行分组

ILookup dataLookup=dataRows.ToLookup(x=>x.parentId);
在此之后,您只需在推送具有正确id的新项目时,循环遍历
堆栈
,直到其为空

while(stack.Count>0){
DataRowSet currentRow=stack.Pop();
foreach(dataLookup[currentRow.Id]中的DataRowSet行集){
stack.Push(行集);
}
}
这样,您就不必再次担心
StackOverflowException
,性能也得到了提高

总的来说,您的新函数看起来有点像这样

私有静态整数计数(列出数据行,整数id)
{
整数=0;
堆栈=新堆栈(
其中(x=>x.Id==Id));
ILookup dataLookup=dataRows.ToLookup(x=>x.parentId);
而(stack.Count>0){
DataRowSet currentRow=stack.Pop();
foreach(dataLookup[currentRow.Id]中的DataRowSet行集){
totals++;
stack.Push(行集);
}
}
传宗接代;
}
可以这样称呼

int cnt=Count(数据列表,1);

@PavelAnikhouski如果你看看我的个人资料,几个月前我也遇到了同样的问题。我刚刚复制了。顺便问一下,这3个勾号是从一个新的Gui按钮中复制的还是手动输入的?我用它作为基础,并用它扩展了我的功能,谢谢。链接也有帮助,我以后可能需要它
Count(dataList, 1, ref cnt);