System.ArgumentOutOfRangeException:参数超出范围.最短路径算法中的错误
本文关键字:算法 最短路径 错误 范围 ArgumentOutOfRangeException 参数 System | 更新日期: 2023-09-27 18:29:08
我正试图解决一个问题。此程序包含图形中的所有边。从来源到目的地的最短路径是找出。我有一个名为dotest的函数,如下所示。
public void dotest()
{
List<edge> tlist;
Int32 x;
setall();
Int32 ind;
foreach (edge e1 in alltest)
{
tlist = new List<edge>(alledge);
ind = 0;
foreach (edge e2 in tlist)
{
if (e2.s == e1.s && e2.d == e1.d)
{
break;
}
ind++;
}
tlist.RemoveAt(ind);
x=shortpath(tlist, start, destination);
if (x != -1)
Console.WriteLine("{0}", x);
else
Console.WriteLine("Infinity");
}
}
描述上述代码。代码已包含所有边的列表(所有边或路径)。我有一系列的输入,其中包含要剪切的边的列表,我必须找到新更新的边列表的最短路径。我编译了我的测试用例,其中一些测试用例成功了。但对于一些测试用例,它有错误消息作为.
未处理的异常:System.ArgumentOutOfRangeException:参数超出范围。参数名称:index位于System.Collections.Generic.List
1[ch_2_3_27.Solution+edge].RemoveAt (Int32 index) [0x00000] in :0 at ch_2_3_27.Solution.dotest () [0x00000] in :0 at ch_2_3_27.Solution.Main (System.String[] args) [0x00000] in :0 [ERROR] FATAL UNHANDLED EXCEPTION: System.ArgumentOutOfRangeException: Argument is out of range. Parameter name: index at System.Collections.Generic.List
1[ch_2_3_27.Solution+edge].RemoveAt(Int32索引)[0x0000]中:0在ch_2_3_27.Solution.dotest()[0x0000]中:0在ch_2_3_27.Solution.Main(System.String[]args)[0x0000]中:0
我真的找不出错误,我认为所有其他部分都能正常工作。有人能帮忙吗??
上面的Edge(Edge)是一个成员为s、d、w(source、destination、weight all Int 32)的结构
实际上错误非常明显。您正试图从tlist
中删除某个索引处的项。但是,该索引没有值。
如果我猜测的话,我会说只有当tlist
中没有任何内容与(e2.s == e1.s && e2.d == e1.d)
匹配时才会发生这种情况,所以你最终会在tlist
数组的实际索引上得到+1。
为了进一步说明,为了简单起见,我们假设tlist
有1个项,那么使用该项的索引将为0。如果If不起作用,则将设置ind++
,从而将ind
设置为1。当你试图从1的索引中删除时,你会得到错误,因为0索引中只有一个对象,而1索引中没有任何对象
我会把代码改成更像这个的代码
ind = -1;
foreach (edge e2 in tlist)
{
ind++;
if (e2.s == e1.s && e2.d == e1.d)
{
break;
}
}
if(ind != -1)
tlist.RemoveAt(ind);
不过,我想说的是,只在if内部执行RemoveAt,这将导致修改后的集合异常,所以我相信这是最好的解决方案。
我建议创建一个新的边类型列表,并添加要在计算中删除的边类型。然后,一旦完成-迭代您的"删除"列表,并将它们从基本列表中删除。还要确保你有IComparable,这样你就可以比较对象并删除正确的对象。