Альтернатива нескольким строкам.Заменяет [дубликат]
этот вопрос уже есть ответ здесь:
мой код использует String.Replace
несколько раз подряд:
mystring = mystring.Replace("somestring", variable1);
mystring = mystring.Replace("somestring2", variable2);
mystring = mystring.Replace("somestring3", variable1);
Я подозреваю, что есть лучший и более быстрый способ сделать это. Что бы вы предложили?
8 ответов:
для "простой" альтернативы просто используйте StringBuilder....
StringBuilder sb = new StringBuilder("11223344"); string myString = sb .Replace("1", string.Empty) .Replace("2", string.Empty) .Replace("3", string.Empty) .ToString();
идем способов сделать это сильнее чтобы понять, что происходит?
если так регулярное выражение является вашим другом
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]);
вы могли бы по крайней мере цепь высказываний:
mystring = mystring.Replace("somestring", variable1) .Replace("somestring2", variable2) .Replace("somestring3", variable3);
вызов
Replace
три раза не только правильный ответ, он может быть предпочтительным:регулярное выражение состоит из трех шагов:Разбирать, Выполнять, Формулировать. Но
String.Replace
жестко, поэтому во многих случаях он имеет превосходную скорость. И сложное регулярное выражение не так читаемо, как хорошо отформатированная цепочкаReplace
заявления. (Сравните ДжонатанС Даниил ' s)если вы все еще не уверены, что
Replace
лучше для вашего кейс, сделай из этого соревнование! Попробуйте оба метода бок о бок и использоватьStopwatch
чтобы увидеть, сколько миллисекунд вы сохраняете при использовании ваших данных.но НЕ оптимизируйте свой код, если вам это не нужно! любой разработчик предпочтет читаемость и ремонтопригодность над загадочной кучей спагетти, которая работает на 3 миллисекунды быстрее.
в этой статье регулярное выражение: замените несколько строк за один проход на C# может быть полезно:
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);
в зависимости от того, как организованы данные (что нужно заменить) или сколько у вас есть; массив и циклы могут быть хорошим решением.
string[] replaceThese = {"1", "2", "3"}; string data = "replace1allthe2numbers3"; foreach (string curr in replaceThese) { data = data.Replace(curr, string.Empty); }
Если вы не хотите использовать регулярное выражение, добавьте этот класс в свой проект,
Он использует метод расширения "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);
мой предпочтительный метод-использовать силу
Regex
для решения проблемы множественной замены. Единственная проблема с этим подходом - вы можете выбрать только одинstring
заменить.следующее заменит все
'/'
или':'
С'-'
чтобы сделать допустимое имя файла.Regex.Replace("invalid:file/name.txt", @"[/:]", "-");