2014-11-08 4 views
-1

Я столкнулся с исключением «System.IndexOutOfRangeException» в проекте и изолировал здесь этот блок кода здесь.Индекс находился за пределами массива. Но индекс находится в границах

using System; 

public class Program 
{ 
    public static void Main() 
    { 
     string testStr = "AB5, BC4, CD8, DC8, DE6, AD5, CE2, EB3, AE7"; 
     //split testStr into substrings representing each edge 
     string [] edges = testStr.Split(", ".ToCharArray()); 

     foreach(string edge in edges) 
     { 
      Console.Write(edge + "\n"); 
      char [] cEdge = edge.ToCharArray(); 
      char cost = cEdge[cEdge.Length - 1]; // what out of bounds? 
      Console.Write(cost); 
     } 
    } 
} 

Этот вопрос исходит от линии "голец стоимость = cEdge [cEdge.Length - 1];". Это не имеет для меня никакого смысла, поскольку cEdge по этой точке должен быть массивом длины 3. Поэтому индексирование в cEdge.Length - 1 должно быть индексом 2 и находиться в пределах границ массива. Я очень смущен, может быть, я кое-что посмотрел. Спасибо за ваше время и помощь.

+0

Если cEdge имеет нулевую длину, то 'cEdge [cEdge.Length-1]' будет генерировать исключение за пределами границ. – dbc

ответ

1

Проблема в том, что массив пуст. Length свойство будет равно 0, а cEdge [0 - 1] в конечном итоге даст вам IndexOutOfRangeException. Рассмотрим проверку Length до того массива индексации:

using System; 

public class Program 
{ 
    public static void Main() 
    { 
     string testStr = "AB5, BC4, CD8, DC8, DE6, AD5, CE2, EB3, AE7"; 
     //split testStr into substrings representing each edge 
     string [] edges = testStr.Split(", ".ToCharArray()); 

     foreach(string edge in edges) 
     { 
      Console.Write(edge + "\n"); 
      char [] cEdge = edge.ToCharArray(); 
      if (cEdge.Length > 0) 
      { 
       char cost = cEdge[cEdge.Length - 1]; // what out of bounds? 
       Console.Write(cost); 
      } 
     } 
    } 
} 
3

По умолчанию метод 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); 

Если раскол случается в сплошном цикле вы можете рассмотреть вопрос о составлении регулярных выражений перед входом в цикл, но это другая проблема.

0

Поскольку значение массива 2-го, 4-го, 6-го и т. Д. В ребрах пусто.

static void Main(string[] args) 
    { 
     string testStr = "AB5, BC4, CD8, DC8, DE6, AD5, CE2, EB3, AE7"; 
     //split testStr into substrings representing each edge 
     string[] edges = testStr.Split(", ".ToCharArray()); 
     char[] cEdge; 
     foreach (string edge in edges) 
     { 
      Console.Write(edge + "\n"); 
      cEdge = edge.ToCharArray(); 
      char cost = new char(); 
      if(cEdge.Length > 0) 
      { 
       cost = cEdge[0]; // what out of bounds? 
      } 
      Console.Write(cost); 
     } 
     Console.Read(); 
    } 
0

трассировать ваш код и я нашел значение ребра содержит "", что вызывает вы должны фиксированные вы код так:

public static void Main() 
     { 
      string testStr = "AB5, BC4, CD8, DC8, DE6, AD5, CE2, EB3, AE7"; 
      //split testStr into substrings representing each edge 
      string[] temp = { ", " }; 
      string[] edges = testStr.Split(temp, StringSplitOptions.RemoveEmptyEntries); 

      foreach (string edge in edges) 
      { 
       Console.Write(edge + "\n"); 
       char[] cEdge = edge.ToCharArray(); 
       char cost = cEdge[cEdge.Length - 1]; // what out of bounds? 
       Console.Write(cost); 
      } 
     } 
0

Вы разделив строку на массив символов из «» и ''
и вы получите что-то вроде:
[ "AB5", "", "BC4", "", ....]
посмотреть здесь http://msdn.microsoft.com/en-us/library/b873y76a(v=vs.110).aspx
В этой линии, чем edge == ""
char cost = cEdge [cEdge.Length - 1];
cEdge.Length == 0
и вы получите System.IndexOutOfRangeException Вы должны использовать следующий синтаксис
testStr.Split ("" .ToCharArray(), StringSplitOptions.RemoveEmptyEntries);