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 больше.