C# Список списка линий Индекс был вне диапазона

У меня есть проблема, очень похожая на упомянутую здесь:

ArgumentOutOfRangeException был необработан

я полагаю, что 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 не обработано. Сообщение = индекс находится вне диапазона. Должен быть неотрицательным и меньшим, чем размер коллекции. Имя параметра: индекс

Каков правильный синтаксис при работе со списком списков?

(Примечание: я не часто программирую на C#, и этот проект я написал и работаю на C++ только для того, чтобы потом узнать, что C# будет лучше работать с остальными утилитами для моей работы. В C++ я использовал векторы для своих контейнеров, но, очевидно, копирование / вставка логики не сработает, так как есть некоторые нюансы списков, о которых я не знаю.) Полагаю, можно также создать класс ContiguousLine, содержащий список строк, и затем добавить к List<ContiguousLine> от freeLines, Даже если бы это было лучшим решением, мне все равно любопытно, почему я не могу обратиться к списку строк таким образом.

2 ответа

Решение

Вам нужно добавить список, прежде чем получить доступ к столбцу

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

Поскольку списки индексируются 0, вы на 1 больше.

Другие вопросы по тегам