2011-08-04 24 views
11

¿Es posible reemplazar una subcadena en una cadena sin asignar un valor de retorno?C# replace string en la cadena

tengo una cadena:

string test = "Hello [REPLACE] world"; 

y quiero reemplazar la subcadena [REPLACE] con otra cosa:

test = test.replace("[REPLACE]", "test"); 

Esto funciona bien, pero ¿cómo puedo hacer sin asignar el valor devuelto a ¿una variable? Quiero algo como esto:

test.replace("[REPLACE]", "test"); 

Respuesta

26

Usted no puede, porque es inmutable string. Fue diseñado para que cualquier "cambio" a una cadena realmente resulte en la creación de un nuevo objeto string. Como tal, si no asigna el valor de retorno (que es la cadena "actualizada", en realidad copia de la cadena original con los cambios aplicados), ha descartado efectivamente los cambios que deseaba realizar.

Si desea realizar cambios en el lugar, podría, en teoría, trabajar directamente con char[] (matriz de caracteres), pero eso es peligroso, y debe evitarse.

Otra opción (como lo señala el Sr. Skeet a continuación) es utilizar StringBuilder y su método Replace(). Una vez dicho esto, los reemplazos simples como el que has mostrado son bastante rápidos, por lo que no querrás molestarte con un StringBuilder a menos que lo hagas con bastante frecuencia.

1

No se puede, las cadenas son inmutables en .NET

1

cadenas en .NET son inmutables, no se pueden editar en línea.

Lo más cerca que puede llegar a la edición en línea es crear un StringBuilder a partir de una cadena, un violín en línea con su contenido y luego hacer que vuelva a escupir una cadena. Pero esto aún producirá una nueva cadena en lugar de alterar el original. Sin embargo, es una técnica útil para evitar la generación de muchas cadenas intermedias cuando se realizan muchas manipulaciones de cadena, p. en un bucle

0

No se puede, en C# las cadenas son inmutables. Algo como esto violaría eso. Necesita tener el tipo de cadena de devolución porque la que está trabajando no puede cambiar.

23

Según lo mencionado por dlev, no se puede hacer esto con string como cadenas son inmutables en .NET - una vez que una cadena se ha construido, no hay nada que puede hacer (excepto el código inseguro o reflexión) para cambiar el contenido . Esto hace más fácil cuerdas general para trabajar, ya que no tendrá que preocuparse por la copia defensiva, que son naturalmente Hilo de seguridad, etc.

Su primo mutable, sin embargo, es StringBuilder - que tiene un método Replace para realizar un reemplazo en el objeto.Por ejemplo:

string x = "Hello [first] [second] world"; 

StringBuilder builder = new StringBuilder(x); 
builder.Replace("[first]", "1st"); 
builder.Replace("[second]", "2nd"); 

string y = builder.ToString(); // Value of y is "Hello 1st 2nd world" 
+0

Gracias alot jon :) eres mi ayudante muy agradable. – jeb

0

Este es el código en busca de cadena a partir de html y pasarlo StringBuilder y establezca el valor de su variable.You no puede hacer string.replace.You tienen que utilizar StringBuilder mientras manipulating.Here en la página html I agregue [Nombre], que se reemplaza por Nombre del código de atrás. Asegúrese de que [Nombre] sea único o puede dar un nombre único.

string Name = txtname.Text; 
string contents = File.ReadAllText(Server.MapPath("~/Admin/invoice.html")); 

       StringBuilder builder = new StringBuilder(contents); 

       builder.Replace("[Name]", Name); 

       StringReader sr = new StringReader(builder.ToString());