2011-01-21 16 views
19

Tengo varias palabras que quiero reemplazar con valores, ¿cuál es la mejor manera de hacerlo?Reemplazar varias palabras en la cadena

Ejemplo: Esto es lo que he hecho pero se siente y se ve tan mal

string s ="Dear <Name>, your booking is confirmed for the <EventDate>"; 
string s1 = s.Replace("<Name>", client.FullName); 
string s2 =s1.Replace("<EventDate>", event.EventDate.ToString()); 

txtMessage.Text = s2; 

Tiene que haber una manera mejor?

gracias

+3

recomiendo algo más exótico para los marcadores cadena de reemplazo, al igual que $ $ VAL $$ en lugar de , ya que es posible que algún día el mensaje realmente necesite contenido XML. –

Respuesta

12

Si usted está planeando tener una serie dinámica de reemplazos, lo que podría cambiar en cualquier momento, y usted quiere que sea un poco más limpio, siempre se puede hacer algo como esto:

// Define name/value pairs to be replaced. 
var replacements = new Dictionary<string,string>(); 
replacements.Add("<Name>", client.FullName); 
replacements.Add("<EventDate>", event.EventDate.ToString()); 

// Replace 
string s = "Dear <Name>, your booking is confirmed for the <EventDate>"; 
foreach (var replacement in replacements) 
{ 
    s = s.Replace(replacement.Key, replacement.Value); 
} 
+1

¿por qué usa el diccionario en lugar de la matriz? – onmyway133

+1

@Yamamoto El ejemplo usa un diccionario para hacer una búsqueda de valor-clave en la palabra del indicador, como '', y reemplazarlo con el valor asociado 'client.FullName'. Una matriz simple de una dimensión no cabría aquí. –

23

usted podría utilizar String.Format.

string.Format("Dear {0}, your booking is confirmed for the {1}", 
    client.FullName, event.EventDate.ToString()); 
+2

+1, también esta es la razón por la cual es una buena idea: http://stackoverflow.com/questions/4671610/why-use-string-format/4671668#4671668 –

+0

El texto es especificado por el usuario para un informe, es su para que sepan que no tienen que escribir el nombre del cliente, y el sistema extraerá el objeto y reemplazará el <> con los valores. El formato – David

+1

sería bueno de usar, para string.Format ("Estimado {0}, su reserva se confirma para el cliente {1}", .FullName, event.EventDate.Encadenar()); Pero el texto es personalizado (por el usuario) por lo que no sabe dónde aparecerá el texto, por lo que no puede usar la opción de formato. – David

4

Puede cadena de la operación Reemplazar juntos:

s = s.Replace(...).Replace(...); 

Tenga en cuenta que no es necesario crear otras cadenas de hacer esto.

Usar String.Format es la forma adecuada, pero solo si puede cambiar la cadena original para adaptarla al formato de llave.

2

Uso String.Format:

const string message = "Dear {0}, Please call {1} to get your {2} from {3}"; 
string name = "Bob"; 
string callName = "Alice"; 
string thingy = "Book"; 
string thingyKeeper = "Library"; 
string customMessage = string.Format(message, name, callName, thingy, thingyKeeper); 
10

para construir sobre la respuesta de George, se podría analizar el mensaje en tokens luego construir el mensaje de las fichas.

Si la cadena de la plantilla era mucho más grande y hay más tokens, esto sería un poco más eficiente ya que no está reconstruyendo el mensaje completo para cada reemplazo de token. Además, la generación de los tokens se puede mover a un Singleton, por lo que solo se realiza una vez.

// Define name/value pairs to be replaced. 
var replacements = new Dictionary<string, string>(); 
replacements.Add("<Name>", client.FullName); 
replacements.Add("<EventDate>", event.EventDate.ToString()); 

string s = "Dear <Name>, your booking is confirmed for the <EventDate>"; 

// Parse the message into an array of tokens 
Regex regex = new Regex("(<[^>]+>)"); 
string[] tokens = regex.Split(s); 

// Re-build the new message from the tokens 
var sb = new StringBuilder(); 
foreach (string token in tokens) 
    sb.Append(replacements.ContainsKey(token) ? replacements[token] : token); 
s = sb.ToString(); 
+0

Me gusta esta respuesta. Es mucho más eficiente que las otras sugerencias si la cadena de entrada es muy grande y hay muchos tokens. – MikeD

3

Cuando haces múltiples sustituye es mucho más eficiente utilizar StringBuilder en lugar de cadena. De lo contrario, la función de reemplazo es hacer una copia de la cadena cada vez que la ejecuta, perdiendo tiempo y memoria.

1

La mejora en lo que dijo ... @ Evan

string s ="Dear <Name>, your booking is confirmed for the <EventDate>"; 

string s1 = client.FullName; 
string s2 = event.EventDate.ToString(); 

txtMessage.Text = s.Replace("<Name>", s1).Replace("EventDate", s2); 
2

Prueba este código:

string MyString ="This is the First Post to Stack overflow"; 
MyString = MyString.Replace("the", "My").Replace("to", "to the"); 

Resultado: MyString ="This is My First Post to the Stack overflow";

Cuestiones relacionadas