130 votes

Remplacement d'un caractère à un index donné dans une chaîne?

Chaîne n'a pas ReplaceAt() , et je suis un peu en chute libre sur la façon de créer une fonction décente qui fait ce dont j'ai besoin. Je suppose que le coût du processeur est élevé, mais la taille des chaînes est petite, donc tout va bien

225voto

Thomas Levesque Points 141081

Utilisez un StringBuilder :

 StringBuilder sb = new StringBuilder(theString);
sb[index] = newChar;
theString = sb.ToString();
 

88voto

Jon Skeet Points 692016

Le plus simple approche serait quelque chose comme:

public static string ReplaceAt(this string input, int index, char newChar)
{
    if (input == null)
    {
        throw new ArgumentNullException("input");
    }
    char[] chars = input.ToCharArray();
    chars[index] = newChar;
    return new string(chars);
}

C'est maintenant une méthode d'extension de sorte que vous pouvez utiliser:

var foo = "hello".ReplaceAt(2, 'x');
Console.WriteLine(foo); // hexlo

Il serait agréable de penser d'une certaine manière qui ne demandait qu'une seule copie des données plutôt que de les deux ici, mais je ne suis pas sûr de toute façon de le faire. Il est possible que cela devrait le faire:

public static string ReplaceAt(this string input, int index, char newChar)
{
    if (input == null)
    {
        throw new ArgumentNullException("input");
    }
    StringBuilder builder = new StringBuilder(input);
    builder[index] = newChar;
    return builder.ToString();
}

... Je pense qu'elle dépend entièrement de la version du framework que vous utilisez.

36voto

Maciej Points 3666
string s = "ihj";
char[] array = s.ToCharArray();
array[1] = 'p';
s = new string(array);

5voto

horgh Points 8992

J'ai soudainement eu besoin de faire cette tâche et trouvé ce sujet. Donc, voici ma variante de style linq:

 public static class Extensions
{
    public static string ReplaceAt(this string value, int index, char newchar)
    {
        if (value.Length <= index)
            return value;
        else
            return string.Concat(value.Select((c, i) => i == index ? newchar : c));
    }
}
 

et ensuite, par exemple:

 string instr = "Replace$dollar";
string outstr = instr.ReplaceAt(7, ' ');
 

Finalement, je devais utiliser .Net Framework 2, alors j’utilise une variante de classe StringBuilder .

5voto

Petar Ivanov Points 29530

Les chaînes sont des objets immuables, vous ne pouvez donc pas remplacer un caractère donné dans la chaîne. Ce que vous pouvez faire, c'est créer une nouvelle chaîne en remplaçant le caractère donné.

Mais si vous voulez créer une nouvelle chaîne, pourquoi ne pas utiliser StringBuilder:

 string s = "abc";
StringBuilder sb = new StringBuilder(s);
sb[1] = 'x';
string newS = sb.ToString();

//newS = "axc";
 

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