2011-01-21 28 views
19

Değerlerle değiştirmek istediğim birden çok kelimem var, bunu yapmanın en iyi yolu nedir?Dize içinde birden çok sözcüğü değiştirin

Örnek: Bu yaptım ama hissediyor ve var sahiptir

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; 

daha iyi bir yol olarak çok yanlış göründüğünü olduğunu ?

sayesinde

+3

Ben $ gibi, yedek dize belirteçler için daha egzotik bir şey tavsiye yerine $ VAL $$, mesajın XML benzeri içeriğe sahip olması gerektiğinden bir gün mümkün. –

cevap

12
istediğiniz zaman değiştirebilir değiştirmelerin dinamik sayısına sahip planlıyorsanız

ve bunu biraz daha temiz yapmak istiyorum, her zaman yapabileceği böyle bir şey:

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

neden dizi yerine sözlük kullanıyorsunuz? – onmyway133

+1

@Yamamoto Örnek, '' gibi gösterge sözcüğünde bir anahtar-değer aramak için bir sözlük kullanır ve 'client.FullName' ile ilişkili değerle değiştirin. Basit bir tek boyutlu dizi burada uymuyordu. –

23

Sen String.Format kullanabilirsiniz.

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

+1, ayrıca neden bu iyi bir fikir: http://stackoverflow.com/questions/4671610/why-use-string-format/4671668#4671668 –

+0

Metin, bir rapor için kullanıcı tarafından belirtilmiştir, onların böylece istemci adını yazmaları gerekmediğini biliyorlar ve sistem nesneyi çekecek ve <> değerleri ile değiştirecektir. – David

+1

biçimlendirmesi string.Format ("Sevgili {0}, rezervasyonunuz {1}", client.FullName, event.EventDate için onaylandı..ToString()); Ama metin (kullanıcı tarafından) custome yani metnin nerede görüntüleneceğini bilmemeniz için format seçeneğini kullanamazsınız. – David

4

Sen zinciri operasyonlarını birlikte değiştirin edebilirsiniz: Bunu başka dizeleri oluşturmak gerekmez

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

Not.

String.Format öğesini kullanmak uygun yoldur, ancak yalnızca orijinal dizeyi brace biçimlendirmesine uyacak şekilde değiştirebilirsiniz.

2

Kullanım 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

George'un cevap üzerine inşa etmek, daha sonra jeton mesajı kurmak dizgeciklerine mesajı ayrıştırmak başladı.

Şablon dizesi çok daha büyük ve daha fazla simge varsa, bu her belirteci değiştirme için iletinin tamamını yeniden oluşturmadığınızdan biraz daha verimli olur. Ayrıca, jetonların üretimi tek bir defada taşınabilir, böylece sadece bir kez yapılır. Birden yerine geçer yaptığınızda

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

Bu cevabı beğeniyorum. Eğer giriş dizgisi çok büyükse ve birçok jeton varsa, diğer önerilerden çok daha verimlidir. – MikeD

3

çok daha etkili yerine dize StringBuilder kullanmak var. Aksi takdirde işlev, her çalıştırdığınızda, zaman ve bellek harcayarak dizenin bir kopyasını oluşturuyor.

1

@Evan söylediklerimi geliştirilmesi ...

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

bu kodu deneyin:

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

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

İlgili konular