C# List of Lines Index 超出范围

C# List of List of Lines Index was out of range

我遇到了一个与这里提到的问题非常相似的问题:

ArgumentOutOfRangeException Was Unhandled

我认为 contiguousLines[columnNum].Add(...) 是导致错误的原因,因为我正在使用 columnNum

建立索引
List<line> freeLines = new List<line>();
List<List<line>> contiguousLines = new List<List<line>>();

while(freeLines.Count > 0)
{
    int columnNum = contiguousLines.Count;
    contiguousLines[columnNum].Add(freeLines[0]);
    freeLines.RemoveAt(0);

    for(int i = 0; i < freeLines.Count; i++)
    {
        int last = contiguousLines[columnNum].Count;
        if(contiguousLines[columnNum][last].upDown(freeLines[i]))
        {
            contiguousLines[columnNum].Add(freeLines[i]);
            freeLines.RemoveAt(i);
            i = -1;
        }
    }
    // Further code that pulls individual elements from freeLines and
    // is intended to place them into contiguousLines.

}

函数upDown只是比较线的起点和终点,看一个(freeLines[i])是否在另一个(contiguousLines[columnNum])的下游。

System.ArgumentOutOfRangeException 未处理 Message=Index 超出范围。必须为非负数且小于 集合。参数名称:index

处理列表的列表时正确的语法是什么?

(注意:我不经常用 C# 编程,这个项目是我用 C++ 编写和工作的,后来才知道 C# 可以更好地与我工作的其余实用程序一起使用。在 C++ 中,我为我的容器使用了矢量,但显然 copy/pasting 逻辑不起作用,因为我不知道列表的一些细微差别。) 我想也可以只创建一个包含行列表的 ContiguousLine class,然后从 freeLines 添加到 List<ContiguousLine>。即使那是一个更好的解决方案,我仍然很好奇为什么我不能以这种方式处理行列表的列表。

您需要先添加一个列表,然后才能访问该列

contiguousLines.Add(new List<line>());
contiguousLines[columnNum].Add(freeLines[0]);
int last = contiguousLines[columnNum].Count;

由于列表是从 0 开始索引的,因此您超过了 1。