J'ai ce code:
string str = "valta is the best place in the World";
Je dois remplacer le premier symbole. Quand j'essaye ceci:
str[0] = 'M';
J'ai reçu une erreur. Comment puis-je faire ceci?
Les chaînes sont immuables, ce qui signifie que vous ne pouvez pas changer un personnage. Au lieu de cela, vous créez de nouvelles chaînes.
Ce que vous demandez peut se faire de plusieurs manières. La solution la plus appropriée variera en fonction de la nature des modifications que vous apportez à la chaîne d'origine. Changez-vous un seul personnage? Avez-vous besoin d'insérer/supprimer/ajouter?
Voici quelques façons de créer une nouvelle chaîne à partir d'une chaîne existante, mais avec un premier caractère différent:
str = 'M' + str.Remove(0, 1);
str = 'M' + str.Substring(1);
Ci-dessus, la nouvelle chaîne est affectée à la variable d'origine, str
.
Je voudrais ajouter que les réponses des autres démontrant StringBuilder
sont également très appropriées. Je n'instancierais pas un StringBuilder
pour changer un caractère, mais si de nombreuses modifications sont nécessaires, StringBuilder
est une meilleure solution que mes exemples qui créent une nouvelle chaîne temporaire dans le processus. StringBuilder
fournit un objet mutable qui permet de nombreuses modifications et/ou opérations d'ajout. Une fois que vous avez terminé vos modifications, une chaîne immuable est créée à partir de StringBuilder
avec la méthode .ToString()
. Vous pouvez continuer à apporter des modifications à l'objet StringBuilder
et créer plus de nouvelles chaînes, si nécessaire, à l'aide de .ToString()
.
Je vous suggère d'utiliser la classe StringBuilder
pour cela et de l'analyser en chaîne si vous en avez besoin.
System.Text.StringBuilder strBuilder = new System.Text.StringBuilder("valta is the best place in the World");
strBuilder[0] = 'M';
string str=strBuilder.ToString();
Vous ne pouvez pas modifier les caractères d'une chaîne de cette manière, car en C #, la chaîne n'est pas dynamique et est immuable et ses caractères sont en lecture seule. Pour vous en assurer, essayez d'utiliser des méthodes de chaîne, par exemple, si vous faites str.ToLower()
cela crée une nouvelle chaîne et votre chaîne précédente ne change pas.
Les cordes sont immuables. Vous pouvez utiliser la classe de générateur de chaînes pour vous aider!:
string str = "valta is the best place in the World";
StringBuilder strB = new StringBuilder(str);
strB[0] = 'M';
J'ai fait une méthode pour ce faire
string test = "Paul";
test = ReplaceAtIndex(0, 'M', test);
(...)
static string ReplaceAtIndex(int i, char value, string Word)
{
char[] letters = Word.ToCharArray();
letters[i] = value;
return string.Join("", letters);
}
Bien qu'il ne réponde pas précisément à la question du PO, selon ce que vous faites, cela pourrait être une bonne solution. Ci-dessous va résoudre mon problème.
Disons que vous devez faire beaucoup de manipulation individuelle de différents caractères dans une chaîne. Au lieu d'utiliser une chaîne tout le temps, utilisez un char[]
array pendant que vous faites la manipulation. Parce que vous pouvez le faire:
char[] array = "valta is the best place in the World".ToCharArray();
Manipulez ensuite le contenu de votre cœur autant que vous en avez besoin ...
array[0] = "M";
Ensuite, convertissez-le en chaîne une fois que vous avez terminé et devez l'utiliser comme chaîne:
string str = new string(array);
Fusion de la réponse de Chuck Norris avec celle de Paulo Mendonça en utilisant des méthodes d'extensions:
/// <summary>
/// Replace a string char at index with another char
/// </summary>
/// <param name="text">string to be replaced</param>
/// <param name="index">position of the char to be replaced</param>
/// <param name="c">replacement char</param>
public static string ReplaceAtIndex(this string text, int index, char c)
{
var stringBuilder = new StringBuilder(text);
stringBuilder[index] = c;
return stringBuilder.ToString();
}
str = "M" + str.Substring(1);
Si vous effectuez plusieurs de ces modifications, utilisez un StringBuilder
ou un char[]
.
(Le seuil à partir duquel StringBuilder
devient plus rapide est après environ 5 concaténations ou sous-chaînes, mais notez que les concaténations groupées de a + "b" + c + d + "e" + f
se fait en un seul appel et des concaténations de type compilation de "a" + "b" + "c"
ne nécessite aucun appel).
Il peut sembler que devoir le faire soit horriblement inefficace, mais le fait que les chaînes ne puissent pas être modifiées permet de nombreux gains d'efficacité et d'autres avantages tels que mentionnés à Pourquoi la chaîne .NET est immuable?