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, это неправильно

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