ArgumentOutOfRangeException при использовании lastIndexOf()
Я действительно озадачен тем, почему я получаю исключение. Вот SSCCE, который я собрал, чтобы продемонстрировать:
static void Main(string[] args)
{
string tmp =
"Child of: View Available Networks (197314), Title: N/A (66244)";
Console.WriteLine(tmp);
int one = tmp.LastIndexOf('('), two = tmp.LastIndexOf(')');
//my own error checking
Console.WriteLine(tmp.Length);//returns 63
Console.WriteLine(one < 0);//returns false
Console.WriteLine(two > tmp.Length);//returns false
Console.WriteLine(one);//returns 56
Console.WriteLine(two);//returns 62
/*
* error occurs here.
* ArgumentOutOfRangeException Index and length must refer to
* a location within the string.
* Parameter name: length
*/
string intptr = tmp.Substring(one, two);
Console.WriteLine(intptr);
}
Я не вижу, что я делаю неправильно (хотя, исходя из фона Java, это может быть тривиально), надеюсь, кто-то еще может.
3 ответа
Решение
substring
Второй параметр - это длина строки, которую вы хотите извлечь, а не позиция в строке.
Вы могли бы сделать
string intptr = tmp.Substring(one + 1, two - one - 1);
Ваш код
tmp.Substring(one, two);
должно быть
tmp.Substring(one, (two-one+1));
Второй параметр - это длина подстроки, которую вы хотите, в то время как я думаю, что вы используете ее так, как будто это конечный индекс. И поскольку я люблю LINQ, это также можно сделать так:
string.Join(string.Empty, s.Skip(5).Take(7 - 5 + 1)); //build a string from IEnumerable<char>
string.Substring (startIndex, count) вы написали startIndex и finishIndex, это неправильно