Заменить несколько слов в строке - PullRequest
20 голосов
/ 21 января 2011

У меня есть несколько слов, которые я хочу заменить значениями, какой лучший способ сделать это?

Пример: это то, что я сделал, но это выглядит и выглядит так неправильно

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;

Должен ли быть лучший способ?

спасибо

Ответы [ 8 ]

23 голосов
/ 21 января 2011

Вы можете использовать String.Format .

string.Format("Dear {0}, your booking is confirmed for the {1}", 
   client.FullName, event.EventDate.ToString());
15 голосов
/ 21 января 2011

Если вы планируете иметь динамическое количество замен, которое может измениться в любое время, и вы хотите сделать его немного чище, вы всегда можете сделать что-то вроде этого:

// 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);
}
10 голосов
/ 03 сентября 2011

Чтобы построить ответ Джорджа, вы можете разобрать сообщение в токены, а затем создать сообщение из токенов.

Если строка шаблона была намного больше и в ней больше токенов, это было бы немного эффективнеепоскольку вы не перестраиваете все сообщение для каждой замены токена.Кроме того, генерация токенов может быть перенесена в синглтон, так что это делается только один раз.

// 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();
4 голосов
/ 21 января 2011

Вы можете связать операции замены вместе:

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

Обратите внимание, что вам не нужно создавать другие строки для этого.

Использование String.Format является подходящим способом, но только если вы можете изменить исходную строку в соответствии с форматированием фигурной скобки.

3 голосов
/ 21 сентября 2012

Когда вы делаете множественные замены, гораздо эффективнее использовать StringBuilder вместо строки.В противном случае функция replace делает копию строки каждый раз, когда вы ее запускаете, тратя время и память.

2 голосов
/ 09 декабря 2013

Попробуйте этот код:

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

Результат: MyString ="This is My First Post to the Stack overflow";

2 голосов
/ 21 января 2011

Использовать 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);
1 голос
/ 15 февраля 2013

Улучшение того, что сказал @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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...