2012-01-24 6 views
31

tengo este código:¿Cómo cambiar 1 char en la cadena?

string str = "valta is the best place in the World"; 

tengo que sustituir el primer símbolo. Cuando intento esto:

str[0] = 'M'; 

He recibido un error. ¿Cómo puedo hacer esto?

+3

¿Qué error estás obteniendo? – Oded

+1

Cualquier error que esté recibiendo es bueno. Las cadenas son objetos inmutables, es normal que el compilador se queje de esa instrucción ... –

+0

@Oded: hay varias razones por las que esto no funcionará. String es inmutable en .NET, a diferencia de, por ejemplo, Delphi, donde esto funcionaría. No puede cambiar los caracteres de cadena por índice como este. C# tampoco tiene conversiones implícitas de cadenas a char: 'M' tendría que declararse como {char c = 'M'}. –

Respuesta

37

cadenas son inmutables, lo que significa que no se puede cambiar un carácter. En cambio, creas nuevas cadenas.

Lo que está pidiendo se puede hacer de varias maneras. La solución más adecuada variará según la naturaleza de los cambios que realice en la cadena original. ¿Estás cambiando solo un personaje? ¿Necesita insertar/eliminar/agregar?

Aquí hay un par de maneras de crear una nueva cadena de una cadena existente, pero que tiene un primer carácter diferente:

str = 'M' + str.Remove(0, 1); 

str = 'M' + str.Substring(1); 

Arriba, la nueva cadena se asigna a la variable original, str.

Me gustaría agregar que las respuestas de otros que demuestren StringBuilder también son muy apropiadas. No crearía una instancia de StringBuilder para cambiar un carácter, pero si se necesitan muchos cambios StringBuilder es una solución mejor que mis ejemplos que crean una nueva cadena temporal en el proceso. StringBuilder proporciona un objeto mutable que permite muchos cambios y/o anexa operaciones. Una vez que haya terminado de realizar los cambios, se crea una cadena inmutable desde StringBuilder con el método .ToString(). Puede continuar realizando cambios en el objeto StringBuilder y crear más cadenas nuevas, según sea necesario, usando .ToString().

31

Le sugiero que use la clase StringBuilder y luego lo analice en cadena si lo necesita.

System.Text.StringBuilder strBuilder = new System.Text.StringBuilder("valta is the best place in the World"); 
strBuilder[0] = 'M'; 
string str=strBuilder.ToString(); 

No se pueden cambiar los caracteres de cadena de esta manera, ya que en C# cadena no es dinámica y es inmutable y es caracteres son de sólo lectura. Para asegurarse de que intente utilizar métodos de cadena, por ejemplo, si lo hace str.ToLower(), hace una nueva cadena y la cadena anterior no cambia.

5
str = "M" + str.Substring(1); 

Si que va a hacer varios cambios tales utilizan un StringBuilder o una char[].

(El umbral de StringBuilder cuando se vuelve más rápido es después de unos 5 concatenaciones o subseries, pero nota que agrupaban concatenaciones de a + "b" + c + d + "e" + f se realizan en una sola llamada y de tipo compilar concatenaciones de "a" + "b" + "c" no requieren una llamada en absoluto).

Puede parecer que tener que hacer esto es terriblemente ineficiente, pero el hecho de que las cadenas no pueden ser cambios permite una gran cantidad de mejoras en la eficiencia y otras ventajas, como se mencionó al Why .NET String is immutable?

13

cadenas son inmutables. Puede utilizar la clase constructor de cadena para ayudar !:

string str = "valta is the best place in the World"; 

StringBuilder strB = new StringBuilder(str); 

strB[0] = 'M'; 
+0

@Bobbity Bob, ¿puedes ser un poco más específico sobre por qué esto es incorrecto? Todo lo que pienso es que no he asignado una cadena al constructor de cadenas (usando su método ToString) – Jeb

+0

No tengo idea de lo que quise decir con eso. acabo de ejecutar el código y funciona. si editas tu respuesta (como insertar un espacio en alguna parte) también lo votaré ... parece estar bien ahora ... –

+0

@Bobbity Bob No te preocupes, ¡gracias! – Jeb

6

hice un método para hacer esto

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); 
    } 
+3

Debe hacer un método de extensión. – Otiel

+0

sería genial! –

+0

es la mejor solución ya que se puede usar en casos distintos al primer personaje. Otras respuestas parecen limitadas. – gunwin

5

Fusionado respuesta de Chuck Norris w/Uso de las extensiones métodos de Paulo Mendonça:

/// <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(); 
} 
6

Si bien no responde a la pregunta de la OP, precisamente, en función de lo lo estás haciendo podría ser una buena solución. A continuación voy a resolver mi problema.

Digamos que tienes que hacer mucha manipulación individual de varios caracteres en una cadena. En lugar de usar una cadena todo el tiempo, use una matriz char[] mientras realiza la manipulación. Debido a que usted puede hacer esto:

char[] array = "valta is the best place in the World".ToCharArray(); 

Entonces manipular contenido de su corazón todo lo que necesita ...

array[0] = "M"; 

luego convertirlo en una cadena, una vez que haya terminado y hay que usarla como una cadena:

string str = new string(array); 
+0

¿Pero no es 'StringBuilder' una mejor opción que un' char [] '? 'StringBuilder' tiene métodos para anexar, insertar, eliminar y formatear, mientras que' char [] 'se mantendrá bastante fijo. Supongo que si tuviera que lidiar con una cadena de longitud fija con solo manipulaciones de un solo carácter, podría elegir 'char []'. –

+0

Mi caso fue para una cadena de longitud fija. Entonces, en mi caso, realmente solo quiero la forma más rápida de reemplazar un personaje. No estaba llamando a otros métodos. Solo compartiendo un método válido que funcionó para mí. – badweasel

+0

Suena bien. ¡Aclamaciones! –

Cuestiones relacionadas