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);