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

que me dará un error,¿cómo configuro un carácter en un índice en una cadena en C#?

¿cómo puedo lograr lo anterior?

Editar:

sí es del tipo 'cadena'

+0

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

+0

Immutabillity es una herramienta poderosa. – Dykam

+0

posible duplicado de [¿Reemplazar un char en un índice dado en una cadena?] (Http://stackoverflow.com/questions/9367119/replacing-a-char-at-a-given-index-in-string) – psubsee2003

Respuesta

27

Si es de tipo string entonces no se puede hacer eso porque las cadenas son inmutables - que no se pueden cambiar una vez que se establecen .

Para lograr lo que se desea, se puede utilizar una actualización StringBuilder

StringBuilder someString = new StringBuilder("someString"); 

someString[4] = 'g'; 

Por qué utilizar un string, en lugar de un StringBuilder? Por muchas razones Aquí hay algunos que puedo pensar:

  • El acceso al valor de una cadena es más rápido.
  • las cadenas se pueden internar (esto no siempre sucede), de modo que si crea una cadena con el mismo valor, no se utiliza memoria adicional.
  • Las cadenas son inmutables, por lo que funcionan mejor en colecciones basadas en hash y son intrínsecamente seguras para hilos.
+0

la diferencia entre una cadena y un StringBuilder? es decir, ¿por qué no debería usar StringBuilders en todas partes? – matt

+0

para obtener más información sobre la clase StringBuilder: http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx –

27

C# strings son inmutables. Debe crear una nueva cadena con los contenidos modificados.

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

Consulte this article sobre cómo modificar el contenido de la cuerda en C#. Las cadenas son inmutables, por lo que se deben convertir en objetos intermedios antes de poder modificarlas.

0

también puede utilizar el método Insert(), p. somestring.Insert (índice, los datos)

3

Si es absolutamente necesario cambiar la instancia existente de una cadena, hay una manera insegura con código:

 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

Es bueno saber esto, gracias, pero por favor no lo haga de esta manera :) – Roberto

Cuestiones relacionadas