web-dev-qa-db-fra.com

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

String n'a pas ReplaceAt(), et je m'efforce un peu de faire une fonction décente qui fasse 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

110
Jason94

Utilisez une StringBuilder:

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

L'approche la plus simple 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 pour que vous puissiez utiliser:

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

Il serait bien de penser à une manière qui nécessite seulement une nique copie des données à créer plutôt que les deux ici, mais je ne suis pas sûr d'aucun moyen de le faire. C'est possible que cela le ferait:

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 suppose que cela dépend entièrement de la version du framework que vous utilisez.

80
Jon Skeet
string s = "ihj";
char[] array = s.ToCharArray();
array[1] = 'p';
s = new string(array);
22
Maciej

J'ai soudainement eu besoin de faire cette tâche et trouvé ce sujet. Donc, voici ma variante de type 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 cependant une variante de classe StringBuilder.

5
horgh

Les chaînes étant des objets immuables, vous ne pouvez pas remplacer un caractère donné dans la chaîne . Ce que vous pouvez faire est de 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";
4
Petar Ivanov

Si votre projet (.csproj) autorise le code non sécurisé, c'est probablement la solution la plus rapide:

namespace System
{
  public static class StringExt
  {
    public static unsafe void ReplaceAt(this string source, int index, char value)
    {
        if (source == null)
            throw new ArgumentNullException("source");

        if (index < 0 || index >= source.Length)
            throw new IndexOutOfRangeException("invalid index value");

        fixed (char* ptr = source)
        {
            ptr[index] = value;
        }
    }
  }
}

Vous pouvez l'utiliser comme méthode d'extension de String objects.

0
dbvega