2010-01-28 3 views
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

Weird ... Я бы отладил это. –

+0

Вы пробовали печатать i и j внутри петли? –

+0

Я смущающе не знаком с отладкой классов C#, используемых на страницах ASP.NET. Я не уверен, как я буду печатать i и j из класса. – Dakine83

ответ

3

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

+0

Ничего себе, посмотрев на это в течение 3 часов, я отправляю вопрос, а затем выясняю его менее чем за 5 минут. Цикл на самом деле прекрасен, как вы предложили Tanzelax. это была строка после цикла, которая была неправильной. Я использовал этот код, который вызовет бесконечный цикл: public int userID { get {return userID; } set {userID = value; } } Человек, это неловко. Извините, спасибо за помощь. - Chris – Dakine83

+0

некоторые стандарты кода сэкономили бы вам много неприятностей! добавьте все внутренние данные с помощью _ или m_ и используйте CamelCasing для всех ваших публичных пользователей.Тогда ошибка, подобная этой, была бы замечена за 2 секунды. –

1

ли на самом деле J приращением? или это как-то сбрасывает его обратно на 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

Спасибо, John, но это не сработало: -/ – Dakine83

+0

изменить j ++ на ++ j? Это не имеет никакого смысла, нет ничего плохого в вашем коде на лице. Я должен быть чем-то, чего мы не можем видеть. –

0

Глядя на GetLength собственности MSDN, в процитировать 'Примером 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/улов, чтобы увидеть, если Convert.ToInt32 или GetLength(0) бросает исключение ...

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

+0

Хорошо! Человек .... Интересно, кто-нибудь заметил мой блок исключений .... Golly S.O. такое влияние на мой взгляд на кодирование ...;) LOL – t0mm13b

+0

Не используйте «throw up». Это испортит вашу трассировку стека. Просто используйте 'throw' – citronas

0

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

Смежные вопросы