System.ArgumentOutOfRangeException:参数超出范围。最短路径算法中的错误

时间:2012-03-28 02:45:37

标签: c# shortest-path

我正在努力解决问题。该程序包含图形中的所有边缘。从源到目的地的最短路径是找出来的。我有一个名为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)

2 个答案:

答案 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,这样你就可以比较对象并删除正确的对象。