2011-01-21 3 views
19

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

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

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; 

Там должно быть лучше?

благодарит

+3

Я рекомендую что-то более экзотическое для замены строки маркеров, как $ $ VAL $$ вместо , так как в какой-то день можно действительно иметь XML-подобный контент. –

ответ

12

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

// 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

Почему вы используете словарь вместо массива? – onmyway133

+1

@Yamamoto В этом примере используется словарь для поиска ключевого значения на индикаторном слове, например «», и заменить его на связанное значение «client.FullName». Простой одномерный массив не поместился бы здесь. –

23

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

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

+1, также вот почему это хорошая идея: http://stackoverflow.com/questions/4671610/why-use-string-format/4671668#4671668 –

+0

Текст указан пользователем для отчета, является их поэтому они знают, что им не нужно писать имя клиента, и система вытащит объект и заменит значения <> на значения. – David

+1

было бы полезно использовать для string.Format («Дорогой {0}, ваше бронирование подтверждено для {1}", client.FullName, event.EventDate.Нанизывать()); Но текст custome (от пользователя), поэтому вы не знаете, где будет отображаться текст, поэтому вы не можете использовать опцию формата. – David

4

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

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

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

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

2

Использование 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

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

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

// 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

Мне нравится этот ответ. Он намного эффективнее других предложений, если входная строка очень велика и есть много токенов. – MikeD

3

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

1

Улучшение на то, что сказал @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

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

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";

Смежные вопросы