.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,

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