web-dev-qa-db-fra.com

Alternative à plusieurs chaînes.

Mon code utilise String.Replace plusieurs fois de suite:

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

Je soupçonne qu'il existe un moyen meilleur et plus rapide de le faire. Que suggérerais-tu?

59
Petter Brodin

Pour une alternative "facile", utilisez simplement un StringBuilder ....

StringBuilder sb = new StringBuilder("11223344");

string myString =
    sb
      .Replace("1", string.Empty)
      .Replace("2", string.Empty)
      .Replace("3", string.Empty)
      .ToString();
63
Rostov

Allons-nous trouver des moyens de rendre cela plus difficile à comprendre ce qui se passe?

Si oui, regex est ton ami

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

En direct: http://rextester.com/SXXB8348

32
Jamiec

Vous pouvez au moins enchaîner les déclarations:

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

Appeler Replace trois fois n'est pas seulement une réponse valide, c'est peut-être la meilleure:

RegEx comprend trois étapes: Analyser, exécuter, formuler. Mais String.Replace est codé en dur, donc dans de nombreux cas, il a une vitesse supérieure. Et un RegEx complexe n'est pas aussi lisible qu'une chaîne bien formatée d'instructions Replace. (Comparez la solution de Jonathan à celle de Daniel )

Si vous n'êtes toujours pas convaincu que Replace est meilleur pour votre cas, faites-en un concours! Essayez les deux méthodes côte à côte et utilisez un Stopwatch pour voir combien de millisecondes vous économisez lorsque vous utilisez vos données.

Mais NE PAS optimiser votre code sauf si vous en avez besoin! Tout développeur préférera lisibilité et maintenabilité sur une pile cryptique de spaghetti qui effectue 3 millisecondes plus rapidement.

13
4444

Cet article Regex: remplacer plusieurs chaînes en une seule passe par C # peut être utile:

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);
5
Jonathan Prates

Selon la façon dont vos données sont organisées (ce que vous remplacez) ou combien vous en avez; un tableau et des boucles peuvent être une bonne approche.

string[] replaceThese = {"1", "2", "3"};
string data = "replace1allthe2numbers3";

foreach (string curr in replaceThese)
{
    data = data.Replace(curr, string.Empty);
}
4
Matt Razza

Si vous ne souhaitez pas utiliser RegEx, ajoutez cette classe à votre projet,
Il utilise une méthode d'extension '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;
    }
}

Ensuite, vous pouvez utiliser ce morceau de code:

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

Ma méthode préférée consiste à utiliser la puissance de Regex pour résoudre un problème de remplacement multiple. Le seul problème avec cette approche est que vous ne pouvez choisir qu'un string pour le remplacer.

Ce qui suit remplacera tous les '/' ou ':' avec un '-' pour créer un nom de fichier valide.

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