我正在努力解决问题。该程序包含图形中的所有边缘。从源到目的地的最短路径是找出来的。我有一个名为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");
}
}
描述上面的代码。代码已包含alledge列表(所有边或路径)。我有一系列输入包含要切断的边缘列表,我必须找到新更新边列表的最短路径。我编译了我的测试用例和一些测试用例。但是对于某些测试用例,它有错误消息。
未处理的异常: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 index)[0x00000] in:0 在ch_2_3_27.Solution.dotest()[0x00000] in:0 在ch_2_3_27.Solution.Main(System.String [] args)[0x00000] in:0
我真的找不到错误,我认为所有其他部分都可以正常工作。有人可以帮忙??
上面的Edge(edge)是一个带有成员s,d,w的结构(源,目标,权重都是Int 32)
答案 0 :(得分:1)
实际上错误很清楚。您正尝试在某个索引处从tlist
中删除某个项目。但是,该索引没有值。
如果我猜测,我会说,只有当tlist
中的任何内容与(e2.s == e1.s && e2.d == e1.d)
匹配时才会发生这种情况,因此您最终会在{{1}的实际索引上获得+1数组。
进一步详细说明,为简单起见,我假设tlist
有1个项目,那么使用该项目的索引将为0.如果你的if不起作用,那么你将设置tlist
,因此将ind++
设置为1.当您尝试从索引处删除1时,您会收到错误,因为0索引中只有一个对象,而且1索引中没有任何内容
我会将代码更改为更像这样的内容
ind
我想说只是在if中执行RemoveAt会导致修改后的集合异常,所以我相信这是最好的解决方案。
答案 1 :(得分:0)
我建议您创建一个新的边缘类型列表,并在计算中添加要删除的边缘类型。然后一旦完成 - 迭代你的“删除”列表并从基本列表中删除它们。还要确保你有IComparable,这样你就可以比较对象并删除正确的对象。