Ваш самый очевидный первый шаг - использование StringBuilder вместо String.
String является неизменяемым типом. Это означает, что после создания его значение никогда не меняется. Таким образом, для каждого вызова Replace, который вы делаете в своем методе, программа создаст совершенно новый экземпляр String для хранения результата, который требует большого объема памяти и процессора. (Я говорю это сравнительно - вы не собираетесь максимально использовать свою машину, вызывая этот метод один раз, но если вы будете вызывать его тысячи раз, вы обязательно заметите!)
StringBuilder, с другой стороны, является классом, предназначенным для манипулирования строками в памяти, и ему не нужно копировать / воссоздавать память каждый раз, когда вы меняете строку.
Итак, одним большим шагом в правильном направлении было бы использовать это в начале вашего метода:
StringBuilder sb = new StringBuilder(path.VirtualPath.ToLower());
string condition = string.Empty;
int index = path.VirtualPath.IndexOf("?");
if (index > -1)
{
condition = virtualPath.Substring(pos);
sb.Remove(0, index);
}
sb.Replace(@"%C5%BD", "ž")
.Replace(@"%C4%90", "đ")
.Replace(@"%C4%86", "ć")
.Replace(@"%C4%8C", "č")
.Replace(@"%C5%A0", "š")
.Replace(",", "-")
.Replace("%20", "-")
.Replace("&", "-")
.Replace(@"-amp;", "&");
sb.Append(condition);
Обратите внимание, что я также сделал .ToLower () ранее, потому что StringBuilder не имеет эквивалента, а также обратите внимание на sb.Append, который снова предотвратит много переписывания.
Это не так оптимально, как могло бы быть, но это должно быть довольно улучшением ...
Единственное, что я пропустил, это заменить "-". StringBuilder не имеет функции «Содержит», но вы можете использовать регулярное выражение, чтобы перехватить все за один проход (вместо необходимости в цикле).
Надеюсь, что вы начали!