String.LastIndexOf() Ошибка?
кто-нибудь знает, почему:
" <exception>".LastIndexOf("<",0) returns -1 (wrong)
а
" <exception>".LastIndexOf("<") returns 2 (right)
и
"<exception>".LastIndexOf("<",0) returns 0 (right)
Является ли это ошибкой или я не понимаю метод LastIndexOf?
Ответы
Ответ 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
.