IndexOutOfRange (метод IsAllDigits)

Я новичок в С# и только изучаю его. Я уверен, что вы сочтете этот вопрос глупым, но я действительно не могу понять настоящую причину следующего в приведенном ниже методе:

    public static bool CheckIfCharactersAreDigits (string raw)
    {
        string s = raw.Trim();
        if (s.Length == 0) return false;
        for (int index = 0; index <= s.Length; index++)
        {
            if (char.IsDigit(s[index]) == false) return false;
        }
        return true;
    }

Почему это ошибка, когда в цикле for я пишу такое выражение: index <= s.length? Это всегда выдает мне ошибку, независимо от того, какие символы или цифры я ввожу. И ошибка IndexOutOfRange. Когда я пишу это выражение следующим образом: index < s.Length; тогда все хорошо. Но почему? Например: я ввожу 100 в качестве аргумента для необработанной строки, а ее индекс равен [0, 1 , 2] или 3. Почему это ошибка, если индекс равен любому аргументу необработанной строки (за исключением чего-либо, содержащего только пробелы или пробелы)?
Если вас это беспокоит, я получаю аргумент для необработанной строки через Console.ReadLine(), если это какая-то ценная информация (не уверен в этом).

Спасибо заранее за любые предложения! Меня это действительно беспокоит...

поскольку ваш индекс основан на 0, массив из 6 элементов имеет длину 6 и индекс 0,1,2,3,4,5. поэтому, когда index <=s и index равен 6, вы входите в цикл и вылетаете, потому что вы читаете за пределами (элемент 6 не существует)

Michael Schönbauer 04.04.2022 12:49

Длина строки на единицу больше, чем последний индекс, поэтому вам нужен index < s.Length.

Andrew Morton 04.04.2022 12:49

s[index] - это ваша проблема здесь, и для ограничений над ним index <= s.Length, который должен быть index <= s.Length -1 ИЛИ index < s.Length

J.Salas 04.04.2022 12:50

Это идеальная ситуация, когда вы могли бы использовать LINQ TrueForAll: docs.microsoft.com/it-it/dotnet/api/…

Marco 04.04.2022 12:53

Вы можете заменить петлю на return s.All(c => char.IsDigit(c)).

Andrew Morton 04.04.2022 12:56

@Marco TrueForAll работает только со списком, тогда как All — это метод LINQ, который работает для IEnumerable, например строки.

Andrew Morton 04.04.2022 13:00

@AndrewMorton да, ты прав. Не имеет большого значения преобразование строки в список, но ваша идея определенно лучше :)

Marco 04.04.2022 13:05
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
48
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы многократно повторяете один индекс. Например, если размер вашего массива равен 10, индекс последнего элемента будет равен 9.

Итак, вам нужно изменить условие цикла с

index <= s.Length

к

index < s.Length

Следовательно, циклы for для массивов (и других стандартных коллекций) всегда должны выглядеть так:

for (int i = 0; i < array.Length; i++)
{

}

Для того, чтобы Избавиться надоедливые ошибки вне диапазона (здесь index <= s.Length вместо index < s.Length) попробуйте либо вопрошание с помощью Линк:

using System.Linq;

...

public static bool CheckIfCharactersAreDigits (string raw)
{
    //DONE: public method arguments validation (note null case)
    if (string.IsNullOrWhiteSpace(raw))
       return false;

    return raw.Trim().All(c => char.IsDigit(c));  
}

или используйте цикл foreach: просто позвольте .net сделать всю работу с индексами за вас:

public static bool CheckIfCharactersAreDigits (string raw)
{
    //DONE: public method arguments validation (note null case)
    if (string.IsNullOrWhiteSpace(raw))
       return false;

    foreach (char c in raw.Trim())
      if (!char.IsDigit(c))
        return false;

    return true;  
}

Другие вопросы по теме