2010-07-16 9 views
8

Je veux faire:Existe-t-il un moyen facile de changer un caractère dans une chaîne en C#?

string s = "abc"; 
s[1] = 'x'; 

et s deviendra "AXC". Cependant, il semble que la chaîne [i] n'a qu'un getter et n'a pas de setter. Le compilateur me donne l'erreur suivante:

"Property or indexer 'string.this[int]' cannot be assigned to -- it is read only"

Je suppose que je pourrais faire une boucle et changer le char que je veux. mais je me demandais juste s'il y a un moyen facile de le faire? Et pourquoi il n'y a pas de setter pour string [i]?

Merci d'avance.

+2

Les chaînes en C# sont immuables, donc vous ne pouvez pas le faire. – ChrisF

Répondre

18

Les chaînes sont immuables, donc vous devez faire un tableau char[], changer, puis le faire revenir dans une chaîne:

string s = "foo"; 
char[] arr = s.ToCharArray(); 
arr[1] = 'x'; 
s = new string(arr); 
+0

merci. deuxième ligne devrait être char [] arr .... tho :) – StarCub

+0

Je l'ai vu et corrigé. Merci quand même :) –

1

Je ne pense pas que vous pouvez le faire en C#, comme la chaîne ne peut pas être modifié (juste détruit et recréé). Jetez un oeil à la classe StringBuilder.

2

(Votre exemple est un peu mal. S [2] = « x » doit changer pour « ABX »)

Non, vous ne pouvez pas, puisque les chaînes sont immuables, vous devez créer une nouvelle chaîne :

http://en.wikipedia.org/wiki/Immutable_object

Vous devez utiliser une méthode qui renvoie une nouvelle chaîne avec la modification souhaitée.

Espérons que ça aide!

+0

bien sûr! Merci d'avoir fait remarquer cela! lol – StarCub

13

Les chaînes sont immuables qui est la raison pour laquelle il n'y a pas setter, vous pouvez cependant utiliser un générateur de chaîne:

StringBuilder s = new StringBuilder("abc"); 

s[1] = 'x'; 
2

Rappelez-vous, en .Net geres et sûr, les chaînes sont immuables, même si vous pouvez le faire ci-dessus , vous créez vraiment une nouvelle copie de la chaîne avec le remplacement.

Si vous remplacez seulement un caractère, une simple boucle est probablement votre meilleur pari.

Cependant, si vous allez faire des remplacements multiples, envisager d'utiliser un StringBuilder:

string s = "abc"; 
    var stringBuilder = new StringBuilder(s); 
    stringBuilder[1] = 'x'; 
    s = stringBuilder.ToString(); 
+0

devrait être stringBuilder [1] = 'x' pas stringBuilder [2]. Cela renvoie abx. – btlog

+0

@btlog - Corrigé. Ta. –

0

Qu'est-ce à ce sujet?

string originalString = "abc"; 

     var index = 1; 
     char charToReplace = 'x'; 

     var newString = string.Format("{0}{1}{2}", originalString.Substring(0, index), charToReplace, originalString.Substring(index + 1)); 
+2

Qu'en est-il de la chaîne newString = originalString.Remove (index, 1) .Insert (index, charToReplace) – btlog

0

oui dans c string # ne peut pas être modifié.

mais nous pouvons essayer ce

string s = "abc"; 
s = s.Replace('b', 'x'); 
Console.WriteLine(s); 

réponse sera "AXC". car cela remplacera l'ancienne chaîne par une nouvelle chaîne.

+0

Mais si la chaîne contient plusieurs "b" et que vous voulez seulement remplacer la première, cela ne fonctionnera pas. – ChrisF

1

Pourquoi ne pas faire cela si vous utilisez une Linq

private string ConvertStr(string inStr , int inIndex , char inChar) 
{ 
char[] tmp = inStr.ToCharArray(); 
tmp.SetValue(inChar , inIndex); 
return new string(tmp); 
} 

Cela devrait vous permettre de remplacer tout ce que vous voulez omble chevalier avec tout ce que vous voulez omble chevalier.