Альтернатива нескольким строкам.Заменяет [дубликат]


этот вопрос уже есть ответ здесь:

мой код использует String.Replace несколько раз подряд:

mystring = mystring.Replace("somestring", variable1);
mystring = mystring.Replace("somestring2", variable2);
mystring = mystring.Replace("somestring3", variable1);

Я подозреваю, что есть лучший и более быстрый способ сделать это. Что бы вы предложили?

8 54

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]);

Live:http://rextester.com/SXXB8348

вы могли бы по крайней мере цепь высказываний:

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", @"[/:]", "-");