Подтвердить что ты не робот

String.LastIndexOf() Ошибка?

кто-нибудь знает, почему:

"  <exception>".LastIndexOf("<",0) returns -1 (wrong)

а

"  <exception>".LastIndexOf("<") returns 2 (right)

и

"<exception>".LastIndexOf("<",0) returns 0 (right)

Является ли это ошибкой или я не понимаю метод LastIndexOf?

4b9b3361

Ответ 1

Вы недопонимаете эту конкретную перегрузку метода LastIndexOf.

docs сообщают следующее:

Поиск начинается с заданной позиции символа и продолжается назад к началу строки.

Обратите внимание, что он говорит backward. Итак, если вы начинаете с позиции 0, в этой позиции или перед этой позицией нет подстроки "<" и, следовательно, результат -1.

В отличие от этого, если вы используете перегрузку, которая принимает только подстроку, поиск начинается в конце строки и, следовательно, правильно находит указанную подстроку.

Ответ 2

Перегрузка string, int32 LastIndexOf говорит в описании, "Сообщает о позиции индекса на основе нуля последнего вхождения указанный символ Юникода в этом экземпляре. Поиск начинается с заданной позиции символа и продолжается назад к началу строки."

Таким образом, если вы пройдете в 0, он будет проверять только первый символ, а не проверять всю строку из 0.

Ответ 3

Второй параметр не делает то, что вы, кажется, думаете:

LastIndex(char value, int startIndex)

startIndex - это char, чтобы начать поиск назад через строку, поэтому, если вы передаете 0, то проверяется только первый char...

Чтобы проверить всю строку с конца, вам придется передать длину строки -1.

см. MSDN String.LastIndex

Ответ 4

Документы (http://msdn.microsoft.com/en-us/library/bc3z4t9d.aspx#Y0) говорят:

Поиск начинается с позиции символа startIndex этого экземпляр и продолжается назад к началу, пока ни одно значение или позиция первого символа была проверена. Для Например, если startIndex - Length - 1, метод ищет каждый символ от последнего символа в строке до начала.

(Мой акцент)

Итак, это:

"  <exception>".LastIndexOf("<",0)

начинается с 0 и работает назад, и поэтому правильно не находит результата и возвращает -1.

Я думаю, что путаница в том, что LastIndexOf отсчитывает назад, где IndexOf рассчитывает вперед.

Ответ 5

Я думаю, что вы не понимаете метод.

Второй параметр - это символ, с которого вы начинаете искать. Если вы ищете назад от символа в позиции 0... результаты верны.

Ответ 6

Это ошибка, потому что LastIndexOf **() ** поиск назад из указанного места.

Попробуйте этот код:

"  <exception>".LastIndexOf("<", 5)

Надеюсь, что это полезно

Ответ 7

Это потому, что второй параметр говорит, что он должен начинаться с нуля и смотреть оттуда и в начало строки.

Вы найдете только строку, если она находится в начале строки, и только если вы ищете строку длиной один символ:

"<exception>".LastIndexOf("<",0)  // returns 0

"<exception>".LastIndexOf("<ex",0) // returns -1

Ответ 8

Это нормально первое выражение находит символ < из элемента 0 из строки, чтобы начать e. г. такой симбол не находят; второй - поиск всей строки и поиск в позиции 2 и последний поиск из 0 симбола, который равен < и верните позицию 0.

msdn) ссылка

Ответ 9

  • haystack.LastIndexOf("needle") ищет строку для последнего появления "иглы" -строки.

  • Метод LastIndexOf и IndexOf возвращает -1, если значение для поиска никогда не происходит.

  • LastIndexOf ищет от < - right-to-left, тогда как

  • IndexOf ищет слева направо →

    • Индексы символов строки начинаются с 0 и увеличиваются слева направо

    • Оба метода предполагают смещение-индекс 0, когда второй параметр не указан

  • Функция также существует в JavaScript как LastIndexOf

    • (Примечание: смешанный или camelBack-корпус), и что установка индекса за пределами длины длины сена сохраняется в JavaScript, но в С# это приведет к System.ArgumentOutOfRangeException: < 0 || > this.Length Exception.

<сильные > Примеры:

"  <exception>".LastIndexOf("<", 3)
 //> returns 2
"  <exception>".LastIndexOf("<", "  <exception>".Length)
 //> returns 2
"  <exception>".LastIndexOf("<", "  <exception>".Length+1)
 //> ArgumentOutOfRangeException
"  <exception>".LastIndexOf("<", 2)
 //> returns 2
"  <exception>".LastIndexOf("<", -1)
 //> returns -1
"  <exception>".LastIndexOf("<", -2)
 //> ArgumentOutOfRangeException
"  <exception>".LastIndexOf("<", 1)
 //> returns -1

Так как в последнем случае в строке символа haystring 0-1 не существует строки или символа <, корректно возвращается -1.