95 votes

Remplacer plusieurs éléments de chaîne en C #

Est-il une meilleure manière de faire ceci...

MyString.Trim().Replace("&", "and").Replace(",", "").Replace("  ", " ")
         .Replace(" ", "-").Replace("'", "").Replace("/", "").ToLower();

J'ai étendu la classe string pour garder vers le bas pour un emploi mais qui est-il un moyen plus rapide?

public static class StringExtension
{
    public static string clean(this string s)
    {
        return s.Replace("&", "and").Replace(",", "").Replace("  ", " ")
                .Replace(" ", "-").Replace("'", "").Replace(".", "")
                .Replace("eacute;", "é").ToLower();
    }
}

Juste pour le fun (et pour arrêter les arguments dans les commentaires) J'ai poussé un résumé analyse comparative les différents exemples ci-dessous.

https://gist.github.com/ChrisMcKee/5937656

La regex option scores terriblement; le dictionnaire est la plus rapide; le de longue haleine version de la classe stringbuilder remplacer est légèrement plus vite que le court de la main.

17voto

TimS Points 429

Si vous recherchez simplement une jolie solution et n'avez pas besoin de gagner quelques nanosecondes, pourquoi pas du sucre LINQ?

 var input = "test1test2test3";
var replacements = new Dictionary<string, string> { { "1", "*" }, { "2", "_" }, { "3", "&" } };

var output = replacements.Aggregate(input, (current, replacement) => current.Replace(replacement.Key, replacement.Value));
 

14voto

TheVillageIdiot Points 22158

ce sera plus efficace:

 public static class StringExtention
{
    public static string clean(this string s)
    {
        return (new StringBuilder(s)).Replace("&", "and").Replace(",", "")
             .Replace("  ", " ").Replace(" ", "-").Replace("'", "")
             .Replace(".", "").Replace("eacute;", "é").ToString().ToLower();
    }
}
 

11voto

Paolo Tedesco Points 22442

Peut-être un peu plus lisible?

     public static class StringExtension {

        private static Dictionary<string, string> _replacements = new Dictionary<string, string>();

        static StringExtension() {
            _replacements["&"] = "and";
            _replacements[","] = "";
            _replacements["  "] = " ";
            // etc...
        }

        public static string clean(this string s) {
            foreach (string to_replace in _replacements.Keys) {
                s = s.Replace(to_replace, _replacements[to_replace]);
            }
            return s;
        }
    }
 

Ajoutez également la suggestion de New In Town concernant StringBuilder ...

2voto

sidDemure Points 11

Je fais quelque chose de similaire, mais dans mon cas, je suis en train de faire de la sérialisation / dé-sérialisation, donc je dois pouvoir aller dans les deux sens. Je trouve que l'utilisation d'une chaîne [] [] fonctionne pratiquement de la même manière que le dictionnaire, y compris l'initialisation, mais vous pouvez également inverser la procédure en renvoyant les valeurs de remplacement aux valeurs d'origine, ce pour quoi le dictionnaire n'a pas été configuré.

Edit: Vous pouvez utiliser Dictionary<Key,List<Values>> pour obtenir le même résultat que string [] []

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X