Мне нужно использовать правила глобализации для поиска всех вхождений строки в документе. Псевдокод:Использование StringComparer с StringBuilder для поиска строки
var searchText = "Hello, World";
var compareInfo = new CultureInfo("en-US").CompareInfo;
DocumentIterator start = null; // the start position if a match occurs
var sb = new StringBuilder();
// the document is not a string, but exposes an iterator to its content
for (var iter = doc.Start(); iter.IsValid(); ++iter)
{
start = start ?? iter; // the start of the potential match
var ch = iter.GetChar();
sb.Append(ch);
if (compareInfo.Compare(searchText, sb.ToString()) == 0) // exact match
{
Console.WriteLine($"match at {start}-{iter}");
// not shown: continue to search for more occurrences.
}
else if (!compareInfo.IsPrefix(criteria.Text, sb.ToString()))
{
// restart the search from the character immediately following start
sb.Clear();
iter = start; // this gets incremented immediately
start = null;
}
}
Этот делегат CompareInfo - это сложная задача, связанная с культурой.
Однако потоковый процесс, реализованный кодом, имеет проблемы с производительностью, поскольку он вызывает StringBuilder.ToString() на каждой итерации, тем самым лишившись преимущества производительности StringBuilder.
Вопрос: Как я могу эффективно выполнять поиск?
Почему вы не можете использовать compareInfo.IndexOf (searchText, sb), где sb - полный документ? – Oleg
@Oleg, я отредактировал код, чтобы более четко указать, что документ не является строкой, но предоставляет итератору его содержание символа. – bright