Ваш исходный код даст разные результаты в зависимости от порядка, в котором элементы возвращаются из _tags;Я очень подозреваю, что это не ваше намерение.
Вместо этого сортируйте теги по порядку, а затем добавляйте их в построитель строк в правильной последовательности:
private string restoreText(string text)
{
StringBuilder sb = new StringBuilder();
foreach( KeyValuePair<int, string> pair in _tags.OrderBy(t => t.Key))
{
sb.Append(pair.Value);
}
return sb.ToString();
}
Если вы действительно хотитесделайте это как можно быстрее, инициализируйте емкость StringBuilder
впереди:
StringBuilder sb = new StringBuilder(_tags.Sum(k => k.Value.Length));
Обновление
Я пропустил первоначально использованный параметр text
инициализировать StringBuilder
.
Чтобы избежать перемешивания текста в памяти (как это вызвано StringBuilder.Insert()
), мы хотим придерживаться использования StringBuilder.Append()
.
Мы можем сделать это путем преобразования исходного текста в другую последовательность KeyValuePair
экземпляров, объединения их с исходным списком и обработки по порядку.
Это будет выглядеть примерно так ( note : adhoc code):
private string restoreText(string text)
{
var textPairs
= text.Select( (c,i) => new KeyValuePair<int,string>(i, (string)c));
var fullSequence
= textPairs.Union(_tags).OrderBy(t => t.Key);
StringBuilder sb = new StringBuilder();
foreach( KeyValuePair<int, string> pair in fullSequence)
{
sb.Append(pair.Value);
}
return sb.ToString();
}
Примечание. Я сделал целую кучу предположений относительно вашего контекста, поэтому это может не сработать для вас.Особенно следует помнить, что .Union()
удалит дубликаты, хотя для этого есть простые обходные пути.