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?
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();
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
Vous pouvez au moins enchaîner les déclarations:
mystring = mystring.Replace("somestring", variable1)
.Replace("somestring2", variable2)
.Replace("somestring3", variable3);
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.
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);
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);
}
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);
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", @"[/:]", "-");