Alternatief voor meerdere String.Vervangt

Mijn code gebruikt String.Replacemeerdere keren achter elkaar:

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

Ik vermoed dat er een betere en snellere manier is om dit te doen. Wat zou je aanraden?


Antwoord 1, autoriteit 100%

Gebruik voor een ‘gemakkelijk’ alternatief gewoon een StringBuilder….

StringBuilder sb = new StringBuilder("11223344");
string myString =
    sb
      .Replace("1", string.Empty)
      .Replace("2", string.Empty)
      .Replace("3", string.Empty)
      .ToString();

Antwoord 2, autoriteit 54%

Gaan we manieren zoeken om dit moeilijkerte maken om te begrijpen wat er aan de hand is?

Als dat zo is, is regex je vriend

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


Antwoord 3, autoriteit 40%

Je zou op zijn minst de uitspraken kunnen koppelen:

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

Antwoord 4, autoriteit 22%

Drie keer Replacebellen is niet alleen een geldig antwoord, het kan ook de voorkeur hebben:

RegEx neemt drie stappen: Parsen, Uitvoeren, Formuleren. Maar String.Replaceis hard gecodeerd, dus in veel gevallen heeft het een superieure snelheid. En een complexe RegEx is niet zo leesbaar als een goed opgemaakte reeks Replace-instructies. (Vergelijk Jonathan‘s oplossing met Daniela>’s)

Als je er nog steeds niet van overtuigd bent dat Replacebeter voor je is, maak er dan een wedstrijd van! Probeer beide methoden naast elkaar en gebruik een Stopwatchom te zien hoeveel milliseconden u bespaart bij het gebruik van uw gegevens.

Maar DOEN’ Tvoortijdig optimaliseren!Elke ontwikkelaar geeft de voorkeur aan leesbaarheid en onderhoudbaarheid boven een cryptische stapel spaghetti die drie milliseconden sneller is.


Antwoord 5, autoriteit 7%

Dit artikel Regex: meerdere strings vervangen in één keer met C#kan nuttig zijn:

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

Antwoord 6, autoriteit 6%

Afhankelijk van hoe uw gegevens zijn georganiseerd (wat u vervangt) of hoeveel u er hebt; een array en loops zou een goede benadering kunnen zijn.

string[] replaceThese = {"1", "2", "3"};
string data = "replace1allthe2numbers3";
foreach (string curr in replaceThese)
{
    data = data.Replace(curr, string.Empty);
}

Antwoord 7, autoriteit 6%

Als u RegEx niet wilt gebruiken, voegt u deze klasse toe aan uw project,
Het gebruikt een extensiemethode ‘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;
    }
}

Dan kun je dit stukje code gebruiken:

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

Antwoord 8

Mijn voorkeursmethode is om de kracht van Regexte gebruiken om een ​​probleem met meerdere vervangingen op te lossen. Het enige probleem met deze aanpak is dat je maar één stringhoeft te kiezen om door te vervangen.

Het volgende vervangt alle '/'of ':'door een '-'om een ​​geldige bestandsnaam te maken.

Regex.Replace("invalid:file/name.txt", @"[/:]", "-");

Other episodes