Поскольку вы, по-видимому, используете фактическое поле поиска, этот код может вам помочь. Он предназначен для полного эмуляции параметров поиска «Блокнот», включая текущую позицию курсора, чувствительность к случаю (в) и поиск вперед/назад. Он будет автоматически закрываться до начала файла, а затем искать текст перед курсором (и наоборот для обратного поиска).
protected Int32 DoSearch(ref String sourceText, String findText, Int32 searchStartPos, StringComparison sc, Boolean forward)
{
Int32 resultPos = -1;
if (forward)
{
// Makes sure that if the cursor is currently ON a result, then the next result is found.
// Not needed for backwards search, since you search before the current position in that case.
if (sourceText.Length - findText.Length >= searchStartPos && findText.Equals(sourceText.Substring(searchStartPos, findText.Length), sc))
searchStartPos++;
resultPos = sourceText.IndexOf(findText, searchStartPos, sc);
if (resultPos == -1)
resultPos = sourceText.IndexOf(findText, 0, searchStartPos, sc);
}
else
{
resultPos = sourceText.LastIndexOf(findText, searchStartPos, sc);
if (resultPos == -1)
{
Int32 start = sourceText.Length;
Int32 length = start - searchStartPos;
resultPos = sourceText.LastIndexOf(findText, start, length, sc);
}
}
return resultPos;
}
Обратите внимание, что sourceText
обрабатывается по ссылке только потому, что обычная переменная строка будет скопирована на вызов функции, которая является тратой времени здесь; текст может быть довольно большим, и эта функция никогда не изменяет строку, поэтому просто передача указателя мне кажется более эффективной.
(В моем полном коде это оптимизировано в остальной части моего кода окна поиска, с событием TextChanged оценки, имел ли текст, который будет повторно извлекается из текстового поля)
Этого поиск то, как правило, с последующим кодом, выбирая соответствующий фрагмент, используя возвращенный resultPos
в качестве начала выбора и findText.Length
в качестве длины выбора.