2010-07-22 2 views
14
someString[someRandomIdx] = 'g'; 

qui va me donner une erreur,comment définir un caractère à un index dans une chaîne dans C#?

comment puis-je obtenir ce qui précède?

Edit:

oui, il est de type « string »

+0

http://msdn.microsoft.com/ fr-us/library/system.string.insert.aspx –

+0

L'immunité est un outil puissant. – Dykam

+0

duplication possible de [Remplacer un caractère à un index donné dans la chaîne?] (Http://stackoverflow.com/questions/9367119/replacing-a-char-at-a-given-index-in-string) – psubsee2003

Répondre

27

Si elle est de type string alors vous ne pouvez le faire parce que les chaînes sont immuables - ils ne peuvent pas être modifiés une fois qu'ils sont fixés .

Pour obtenir ce que vous désirez, vous pouvez utiliser un StringBuilder

StringBuilder someString = new StringBuilder("someString"); 

someString[4] = 'g'; 

Mise à jour

Pourquoi utiliser un string, au lieu d'un StringBuilder? Pour beaucoup de raisons. Voici quelques-uns que je peux penser à:

  • L'accès à la valeur d'une chaîne est plus rapide.
  • Les chaînes peuvent être internées (ce qui n'arrive pas toujours), de sorte que si vous créez une chaîne avec la même valeur, aucune mémoire supplémentaire n'est utilisée.
  • Les chaînes sont immuables, donc elles fonctionnent mieux dans les collections basées sur le hachage et elles sont intrinsèquement sûres.
+0

la différence entre une chaîne et un StringBuilder? Par exemple, pourquoi n'utiliserais-je pas simplement StringBuilders partout? – matt

+0

pour plus d'informations sur la classe StringBuilder: http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx –

27

Les chaînes C# sont immuables. Vous devriez créer une nouvelle chaîne avec le contenu modifié.

char[] charArr = someString.ToCharArray(); 
charArr[someRandomIdx] = 'g'; // freely modify the array 
someString = new string(charArr); // create a new string with array contents. 
2

Consultez la section this article pour savoir comment modifier le contenu d'une chaîne en C#. Les chaînes sont immuables, elles doivent donc être converties en objets intermédiaires avant de pouvoir être modifiées.

0

Vous pouvez également utiliser la méthode Insert(), par ex. somestring.Insert (index, données)

3

Si vous devez absolument changer l'instance existante d'une chaîne, il y a un moyen avec dangereux Code:

 public static unsafe void ChangeCharInString(ref string str, char c, int index) 
     { 
      GCHandle handle; 
      try 
      { 
       handle = GCHandle.Alloc(str, GCHandleType.Pinned); 
       char* ptr = (char*)handle.AddrOfPinnedObject(); 
       ptr[index] = c; 
      } 
      finally 
      { 
       try 
       { 
        handle.Free(); 
       } 
       catch(InvalidOperationException) 
       { 
       } 
      } 
     } 
+0

Bon à savoir, merci, mais s'il vous plaît ne le faites pas de cette façon :) – Roberto

Questions connexes