Бесконечная петля? Не могу понять почему

2

У меня есть функция, которая принимает roleID(as an int) и сравнивает ее с многомерным массивом, чтобы увидеть, содержит ли этот массив этот roleID. если это так, он устанавливает bool в true и breaks. если это не так, цикл никогда не выходит. Я надеюсь, что это что-то глупое, что я упускаю из виду, но теперь у меня было несколько разных людей.

Размер userRoles array, который я тестирую прямо сейчас, составляет 3. Я могу распечатать userRoles.GetLength(0), и он говорит 3, и это соответствует whats в базе данных.

здесь код:

public bool IsInRole(int roleID)
    {
        bool inRole = false;
        int i = userRoles.GetLength(0);
        for (int j = 0; j < i; j++)
        {
            if (Convert.ToInt32(userRoles[j, 0]) == roleID)
            {
                inRole = true;
                break;
            }
        }
        return inRole;
    }

ТИА,
Крис

  • 0
    Странно ... Я бы отладил это.
  • 0
    Вы пытались напечатать I и J внутри цикла?
Показать ещё 2 комментария
Теги:

4 ответа

3
Лучший ответ

Вы уверены, что не ошибаетесь в симптоме, и что он действительно застревает в цикле? Код, который у вас там, не выглядит неправильным, моя первая мысль заключалась в том, что место, которое вы вызываете IsInRole(), неправильно обрабатывает "false".

  • 0
    Ух ты, посмотрев на это в течение 3 часов, я отправлю вопрос, а затем выясню это менее чем за 5 минут. Цикл на самом деле хорошо, как вы предложили Tanzelax. это была строка после цикла, которая была неправильной. Я использовал этот код, который вызовет бесконечный цикл: public int userID {get {return userID; } set {userID = value; }} Человек это смущает. Извините всех, спасибо за помощь. Крис
  • 0
    некоторые стандарты кода избавили бы вас от многих проблем! добавьте к _ или m_ все внутренние поля и используйте CamelCasing для всех ваших открытых участников. Тогда такая ошибка была бы замечена через 2 секунды.
1

Действительно ли j увеличивается? или он каким-то образом reset возвращается к 0?

Попробуйте это

public bool IsInRole(int roleID)
{
    bool inRole = false;
    int i = userRoles.GetLength(0);
    for (int j = 0; j < i; j++)
    {
        int k = j;
        if (Convert.ToInt32(userRoles[k, 0]) == roleID)
        {
            inRole = true;
            break;
        }
    }
    return inRole;
}
  • 0
    Спасибо Джон, но это не сработало: - /
  • 0
    изменить j ++ на ++ j? Это не имеет смысла, нет ничего плохого в том, что ваш код на его лице. Я должен быть чем-то, чего мы не можем видеть.
0

Глядя на MSDN GetLength свойство, чтобы процитировать:" Примером GetLength является GetLength (0), который возвращает количество элементов в первом измерении массива.

public bool IsInRole(int roleID)
    {
        bool inRole = false;
        try{
            int i = userRoles.GetLength(0);
            for (int j = 0; j < i; j++)
            {
               if (Convert.ToInt32(userRoles[j, 0]) == roleID)
               {
                   inRole = true;
                   break;
               }
            }
        }catch(Exception up){
            throw up;
        }

        return inRole;
    }

Я был бы склонен обернуть логику в try/catch, чтобы увидеть, что Convert.ToInt32 или GetLength(0) выбрасывает исключение...

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

  • 0
    Хорошо! Чувак ... удивительно, кто-нибудь заметил мой блок исключений ... Черт возьми, это так сильно повлияло на мой взгляд на кодирование ....;) LOL
  • 0
    Не используйте «подбрасывать». Это испортит ваш след стека. Просто используйте «бросить»
0

Ваша петля выглядит сплошной, поэтому она не должна выходить по другой причине. Может ли ваш массив содержать значение, которое заставляет Convert.ToInt32 зависать или бросать?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню