2012-08-23 4 views
6

Estoy intentando crear un método de extensión para una cadena que toma un argumento y agrega el argumento al valor de la cadena. Aquí está el comportamiento Quiero:C# Reemplazar el valor de la cadena original en el método de extensión

public static void AddNumber(this string originalValue, string id) 
    { 
     List<string> ids = originalValue.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToString(); 
     ids.Add(id); 
     string newValue = string.Join(",", ids); 
     originalValue = newValue; 
    } 

Entonces me gustaría utilizar esto como sigue:

 string testing = ""; 
     testing.AddNumber("1"); // value should be 1 
     testing.AddNumber("2"); // value should be 1,2 
     testing.AddNumber("3"); // value should be 1,2,3 

La cuestión es que estoy viendo esto:

 string testing = ""; 
     testing.AddNumber("1"); // value is "" 
     testing.AddNumber("2"); // value is "" 
     testing.AddNumber("3"); // value is "" 

Ahora tengo lea el this! tema aquí en StackOverflow, y soy consciente de que estoy haciendo algo similar. No puedo reemplazar todo el valor de la cadena, tengo que modificar el contenido de la cadena que se envía ... No puedo encontrar una manera de modificarlo. Intenté modificar la matriz de caracteres y no tuve suerte. ¿Algunas ideas?

+2

Cambiar el método de '' void' a string' y tratar 'de prueba = testing.AddNumber ("1");' –

Respuesta

17

Las cadenas son inmutables.
Eso es fundamentalmente imposible.

+1

Sobre la base de toda mi investigación y la retroalimentación de todos los demás parece que es no es posible crear un método de extensión y hacer que reemplace o modifique el valor original – GingerLoaf

+0

VB.net extraño puede hacer esto –

+0

@JackGajanan: No; Las cadenas en VB.Net también son inmutables. ¿O estás hablando de parámetros 'ByRef'? – SLaks

6

Para lograr esto, debe pasar this string originalValue como ref, pero eso no es posible. Puede hacerlo con un método normal, sin embargo:

public static void AddNumber(ref string originalValue, string id) 

pero tiene que ser llamado como esto:

AddNumber(ref testing, "1"); 
+0

'out' tiene más sentido que' ref 'en esta situación. –

+2

@ P.Brian.Mackey No, en realidad, 'ref' tiene más sentido que' out'. Quiere leer la cadena, generar una nueva cadena basada en ese valor, y luego establecer la variable a ese valor generado. Textboox 'ref'. – Servy

+0

@Servy oh mi error, leí totalmente el método. Convenido. –

3

usted tiene que utilizar este método así:

public static string AddNumber(this string originalValue, string id) 
    { 
     List<string> ids = originalValue.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToString(); 
     ids.Add(id); 
     string newValue = string.Join(",", ids); 
     return newValue; 
    } 

testing = testing.AddNumber("1"); 

Pero puede hacerlo con un StringBuilder:

public static void AddNumber(this StringBuilder builder, string id) 
{ 
    var originalValue = builder.ToString(); 
    if (originalValue.EndsWith(",") || string.IsNullOrEmpty(originalValue)) 
     builder.Append(id); 
    else 
     builder.Append("," + id); 
} 

var testing = new StringBuilder(); 
testing.AddNumber("1"); 
testing.AddNumber("2"); 
testing.AddNumber("3"); 

También cambié el algoritmo. No parece tan eficiente.

0

Sí, se puede hacer esto con StringBuilder,

ejemplo sencillo;

public static void AddNumber(this StringBuilder value, int i) 
     { 
      value.Append(i.ToString()); 
     } 


    StringBuilder testing = new StringBuilder(); 
     testing.AddNumber("1"); 
     testing.AddNumber("2"); 
     testing.AddNumber("3"); 
     Console.WriteLine(testing.ToString()); //123 
Cuestiones relacionadas