Индекс массива C # всегда превышен - PullRequest
3 голосов
/ 29 ноября 2011

У меня очень странная проблема в C #, и я не уверен, в чем причина. Взгляните на следующий фрагмент кода:

foreach(string bed in bayBeds)
{
    string[] bedProperties = bed.Split(new char[] { '^' });
    if (bedProperties.Length > 0)
    {
        string genderCode = bedProperties[1];
        if (genderCode == "M")
        {
            bedCount = bedCount + bayBeds.Count;
            break;
        }
    }
}

В этом примере проверяется строковый массив bedProperties, если его длина больше 0, и, если это так, извлекается элемент 1. Проблема в том, что этот код всегда генерирует исключение вне границ. Я могу изменить, чтобы вернуть bedProperties.Length, и он даст мне значение, такое как 3 (которое фактически является числом свойств в этом объекте), но при этом любая попытка получить элемент массива по индексу (например, bedProperties [1], bedProperties [0] и т. д.) будет всегда давать мне исключение вне границ. Всегда . Я не могу понять, почему это будет.

Пожалуйста, поймите, что я что-то вроде взлома c #, поэтому, если я сделал какую-то смехотворно глупую ошибку, пожалуйста, не будьте слишком резкими.

Спасибо - я ценю любую помощь.

РЕДАКТИРОВАТЬ: Я нашел проблему, основанную на большей части помощи ниже.

Для ясности, это вся функция:

public int returnMaleBedTotal(string bedCollection) {
      // determine total number of male beds for a bay
      int bedCount = 0;
      if (bedCollection.Length > 0) {
        List<string> theBays = new List<string>(bedCollection.Split(new char[] { '@' }));

        // at this point we have the bays, so iterate them and extract the beds in the bays
        foreach (string bayBedCollection in theBays) {
          List<string> bayBeds = new List<string>(bayBedCollection.Split(new char[] { '|' }));

          // now we have the beds in the bay, so extract the bed properties and determine if the bed is male
          foreach(string bed in bayBeds) {
            string[] bedProperties = bed.Split(new char[] { '^' });
            if (bedProperties.Length > 1) {
              string genderCode = bedProperties[1];
              string bedStatus = bedProperties[2];
              if (genderCode == "M") {
                bedCount = bedCount + bayBeds.Count;
                break;

              }

            }

          }

        }

      } 

      return bedCount;

    }

Это принимает коллекцию в виде большой строки, которая выглядит следующим образом:

100000^^3|100002^^1|100003^^3|100004^F^2|100005^^2@100006^^1|100007^^2|100008^M^2|100009^^1|100010^^3@100011^M^2|100012^M^2|100013^M^1|100014^M^2|100015^M^1@100016^F^1|100017^^1|100018^F^1|100019^^1|100020^^1

Затем он разбивает его на блоки, которые выглядят так:

100000^^3|100002^^1|100003^^3|100004^F^2|100005^^2

Что он дополнительно разбирает на такие единицы:

100005^^2 or 100004^F^2

Иногда во время этих итераций один из этих блоков возвращался неправильно сформированным и имел длину 1, поэтому попытка получить индекс> 0 не удалась.

Кстати, это метод расширения внутри преобразования, и именно поэтому исходная коллекция принимается за большую строку.

Спасибо всем, кто помог - извините, я не могу выбрать более одного правильного ответа.

Ответы [ 3 ]

5 голосов
/ 29 ноября 2011

Вы встречаете строки без символа ^:

Либо исправьте индекс:

if (bedProperties.Length > 0) {
  string genderCode = bedProperties[0]; // would take the **first** split element

, либо условие:

if (bedProperties.Length > 1) {
  string genderCode = bedProperties[1]; // would take the **second** split element

(Индексы начинаются с нуля !!)

5 голосов
/ 29 ноября 2011
if (bedProperties.Length > 0)

Должно быть действительно:

if(bedProperties.Length > 1)

Поскольку любая строка при разбиении вернет себя в одном элементном массиве. Если бы какое-либо разделение действительно имело место, в массиве было бы два или более элементов.

0 голосов
/ 29 ноября 2011

вы проверяете на if (bedProperties.Length > 0), но вы получаете доступ к bedProperties[1]; Вы должны проверить на if (bedProperties.Length > 1), чтобы убедиться, что индекс 1. доступен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...