.NET CultureInfo.InvariantCulture.CompareInfo IndexOf против LastIndexOf - Что происходит?
В нашем приложении я хотел быть хорошим гражданином и перейти от сравнения строк с учетом культурных особенностей к некоторым детерминированным сравнениям в InvariantCulture, но из-за этого мое приложение начало аварийно завершать работу с OutOfMemory из-за бесконечного цикла.
Все сводится к этому. Я оценил это в Immediate Window:
CultureInfo.InvariantCulture.CompareInfo.IndexOf("(např. BroadSwo", " ", 0, CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace);
6
CultureInfo.InvariantCulture.CompareInfo.LastIndexOf("(např. BroadSwo", " ", 0, CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace);
-1
Что здесь происходит?
Как LastIndexOf может дать мне 'not found', когда IndexOf с той же культурой и тем же вводом дает мне 'found some'?
Это ошибка? Или чего мне не хватает?
2 ответа
Я ошибался..
LastIndexOf выполняет поиск от конца источника до начала. Поэтому, когда я устанавливаю startPosition = 0, он переходит из положения 0 в 0 и ничего не находит.
Правильный вызов LastIndexOf:
CultureInfo.InvariantCulture.CompareInfo.LastIndexOf("(např. BroadSwo", " ", "(např. BroadSwo".Length - 1, CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace);
6
Кажется, что startIndex
параметр CultureInfo.InvariantCulture.CompareInfo.LastIndexOf
должна быть длина строки, потому что она ищет в обратном направлении. Это сработало для меня:
CultureInfo.InvariantCulture.CompareInfo.LastIndexOf("(např. BroadSwo", " ", 15, CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace)
Вернул 6 как сделал IndexOf
,