Подтвердить что ты не робот

Альтернатива нескольким String.Replaces

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

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

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

4b9b3361

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