По умолчанию метод Split
включает пустые строки в массиве. Итак, вы - cEdge
. Массив имеет размер 17, причем около 8 из них являются пустыми. Поэтому, когда вы пытаетесь выполнить итерацию через массив, длина пустой строки равна 0, и вы пытаетесь вычесть 1, что помещает вас за пределы массива.
У вас здесь пара вариантов. Вы можете поместить оператор if, чтобы длина cEdge
составляла 3 символа или обновляла метод Split, чтобы использовать одну из перегрузок, которая автоматически удалит эти пустые элементы.
Вот как вы бы использовать перегрузку:
string[] edges = testStr.Split(", ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
Редактировать
Просто понял, что я на самом деле не объяснить, почему вы получите дополнительные пустые группы. Пустые элементы появляются, потому что вы предоставили функцию split с массивом разделителей. Затем функция использует массив для сопоставления ЛЮБОГО одного из разделителей и разбивает его на уникальные элементы. В вашем случае идеальный пример, когда это имеет значение. Если ваша исходная строка testStr
должна содержать пробел в одном из полей, она фактически сломает это поле пополам, потому что вы предоставили пробел в список разделителей.
В качестве MSDN article помещает это:
Каждый элемент сепаратора определяет отдельный символ-разделитель. Если два разделителя смежны, или разделитель найден в начале или конце этого экземпляра, соответствующий элемент массива содержит Empty.
Так, например:
string testStr = "AB5, BC4, CD8 Test, DC8";
string [] edges = testStr.Split(", ".ToCharArray());
В этом случае большинство людей считают, что мы в конечном итоге с массивом, который выглядит примерно так:
+----------------------------+
| AB5 | BC4 | CD8 Test | DC8 |
+----------------------------+
Однако фактический объем производства этого метод будет более примерно таким:
+------------------------------+
| AB5 | BC4 | CD8 | Test | DC8 |
+------------------------------+
Для того, чтобы получить требуемый выход каждый раз, более надежное решение будет выглядеть примерно так:
String[] edges = Regex.Split(testStr, Regex.Escape(", "), RegexOptions.None);
Если раскол случается в сплошном цикле вы можете рассмотреть вопрос о составлении регулярных выражений перед входом в цикл, но это другая проблема.
Если cEdge имеет нулевую длину, то 'cEdge [cEdge.Length-1]' будет генерировать исключение за пределами границ. – dbc