Альтернатива нескольким String.Replaces
Мой код использует String.Replace
несколько раз подряд:
mystring = mystring.Replace("somestring", variable1);
mystring = mystring.Replace("somestring2", variable2);
mystring = mystring.Replace("somestring3", variable1);
Я подозреваю, что есть лучший и быстрый способ сделать это. Что бы вы предложили?
Ответы
Ответ 1
Для "простой" альтернативы просто используйте StringBuilder....
StringBuilder sb = new StringBuilder("11223344");
string myString =
sb
.Replace("1", string.Empty)
.Replace("2", string.Empty)
.Replace("3", string.Empty)
.ToString();
Ответ 2
Идем ли мы к способам сделать это сложнее понять, что происходит?
Если это регулярное выражение - ваш друг
var replacements = new Dictionary<string,string>()
{
{"somestring",someVariable1},
{"anotherstring",someVariable2}
};
var regex = new Regex(String.Join("|",replacements.Keys.Select(k => Regex.Escape(k))));
var replaced = regex.Replace(input,m => replacements[m.Value]);
Live: http://rextester.com/SXXB8348
Ответ 3
Вы могли бы, по крайней мере, связать утверждения:
mystring = mystring.Replace("somestring", variable1)
.Replace("somestring2", variable2)
.Replace("somestring3", variable3);
Ответ 4
Вызов Replace
три раза - это не только действительный ответ, он может быть предпочтительным:
RegEx выполняет три шага: Parse, Execute, Formulate. Но String.Replace
жестко закодирован, поэтому во многих случаях он имеет превосходную скорость. И сложный RegEx не так читается, как хорошо отформатированная цепочка операторов Replace
. (Сравните решение Jonathan для Daniel)
Если вы все еще не уверены, что Replace
лучше для вашего дела, сделайте конкурс из него! Попробуйте оба метода бок о бок и используйте Stopwatch
, чтобы узнать, сколько миллисекунд вы сохраняете при использовании своих данных.
Но НЕ оптимизируйте свой код, если вам не нужно!. Любой разработчик предпочтет удобство чтения и обслуживания загадочная куча спагетти, которая быстрее работает на 3 миллисекунды.
Ответ 5
Эта статья Regex: заменить несколько строк за один проход с помощью С# может быть полезно:
static string MultipleReplace(string text, Dictionary replacements) {
return Regex.Replace(text,
"(" + String.Join("|", adict.Keys.ToArray()) + ")",
delegate(Match m) { return replacements[m.Value]; }
);
}
// somewhere else in code
string temp = "Jonathan Smith is a developer";
adict.Add("Jonathan", "David");
adict.Add("Smith", "Seruyange");
string rep = MultipleReplace(temp, adict);
Ответ 6
В зависимости от того, как организованы ваши данные (что вы заменяете) или сколько у вас есть; массив и петли могут быть хорошим подходом.
string[] replaceThese = {"1", "2", "3"};
string data = "replace1allthe2numbers3";
foreach (string curr in replaceThese)
{
data = data.Replace(curr, string.Empty);
}
Ответ 7
Если вы не хотите использовать RegEx, добавьте этот класс в свой проект,
Он использует метод расширения "MultipleReplace":
public static class StringExtender
{
public static string MultipleReplace(this string text, Dictionary<string, string> replacements)
{
string retVal = text;
foreach (string textToReplace in replacements.Keys)
{
retVal = retVal.Replace(textToReplace, replacements[textToReplace]);
}
return retVal;
}
}
Затем вы можете использовать этот фрагмент кода:
string mystring = "foobar";
Dictionary<string, string> stringsToReplace = new Dictionary<string,string>();
stringsToReplace.Add("somestring", variable1);
stringsToReplace.Add("somestring2", variable2);
stringsToReplace.Add("somestring3", variable1);
mystring = mystring.MultipleReplace(stringsToReplace);
Ответ 8
Мой предпочтительный метод - использовать мощность Regex
для решения проблемы с множественной заменой. Единственная проблема с этим подходом - вы можете выбрать только один string
для замены.
Ниже будут заменены все '/'
или ':'
на '-'
, чтобы создать допустимое имя файла.
Regex.Replace("invalid:file/name.txt", @"[/:]", "-");