Я новичок в С# и только изучаю его. Я уверен, что вы сочтете этот вопрос глупым, но я действительно не могу понять настоящую причину следующего в приведенном ниже методе:
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(), если это какая-то ценная информация (не уверен в этом).
Спасибо заранее за любые предложения! Меня это действительно беспокоит...
Длина строки на единицу больше, чем последний индекс, поэтому вам нужен index < s.Length.
s[index] - это ваша проблема здесь, и для ограничений над ним index <= s.Length, который должен быть index <= s.Length -1 ИЛИ index < s.Length
Это идеальная ситуация, когда вы могли бы использовать LINQ TrueForAll: docs.microsoft.com/it-it/dotnet/api/…
Вы можете заменить петлю на return s.All(c => char.IsDigit(c)).
@Marco TrueForAll работает только со списком, тогда как All — это метод LINQ, который работает для IEnumerable, например строки.
@AndrewMorton да, ты прав. Не имеет большого значения преобразование строки в список, но ваша идея определенно лучше :)





Вы многократно повторяете один индекс. Например, если размер вашего массива равен 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;
}
поскольку ваш индекс основан на 0, массив из 6 элементов имеет длину 6 и индекс 0,1,2,3,4,5. поэтому, когда index <=s и index равен 6, вы входите в цикл и вылетаете, потому что вы читаете за пределами (элемент 6 не существует)