Dizeleri nasıl enterpolasyon yaparım?


106

Aşağıdakileri C # 'da yapmak istiyorum (bir Python arka planından gelir):

strVar = "stack"
mystr  = "This is %soverflow" % (strVar)

Dizenin içindeki belirteci dışındaki değerle nasıl değiştiririm?

Yanıtlar:



270

Bu, C # 6.0 (Visual Studio 2015+) itibarıyla eklenmiştir.

Misal:

var planetName = "Bob";
var myName = "Ford"; 
var formattedStr = $"Hello planet {planetName}, my name is {myName}!";
// formattedStr should be "Hello planet Bob, my name is Ford!"

Bu sözdizimsel şekerdir:

var formattedStr = String.Format("Hello planet {0}, my name is {1}!", planetName, myName);

Ek kaynaklar:

C # (v2) Tartışması için Dize Enterpolasyonu

C # 6.0 Dil Önizlemesi


Mono için yama (2009 tarihli, kilometreniz değişebilir) tirania.org/blog/archive/2009/Dec-20.html
Mağarası

1
Tek
renkli

Bu özellik çok güzel bir şey. Özellikle VS2015 ve editör desteği ile enterpolasyonlu dizeleri net bir şekilde görebilir ve bilgi alabilirsiniz. Yöntemlerle bile çalışır! $("This feature is {GetDescription(FEATURE_AMAZING))}");
Patrick

14

string.FormatDeğerleri dizelere bırakmak için kullanabilirsiniz :

private static readonly string formatString = "This is {0}overflow";
...
var strVar = "stack";
var myStr = string.Format(formatString, "stack");

Bir alternatif, C # birleştirme operatörünü kullanmaktır:

var strVar = "stack";
var myStr = "This is " + strVar + "overflow";

Çok fazla birleştirme yapıyorsanız StringBuilder, daha verimli olan sınıfı kullanın :

var strVar = "stack";
var stringBuilder = new StringBuilder("This is ");
for (;;)
{
    stringBuilder.Append(strVar); // spot the deliberate mistake ;-)
}
stringBuilder.Append("overflow");
var myStr = stringBuilder.ToString();


12

Şu anda C # 6.0 ile Visual Studio 2015 kullanıyorsanız, aşağıdakileri deneyin:

var strVar = "stack";

string str = $"This is {strVar} OverFlow";

bu özelliğe dize enterpolasyonu denir.


6

Bunun operatörü yok. Kullanmanız gerekiyor string.Format.

string strVar = "stack";
string mystr  = string.Format("This is {0}soverflow", strVar);

Maalesef string.Formatstatik bir yöntemdir, bu yüzden kolayca yazamazsınız "This is {0}soverflow".Format(strVar). Bazı kişiler bu sözdizimine izin veren bir uzantı yöntemi tanımlamıştır.


5

Kullanım string.Format:

string mystr = string.Format("This is {0}overflow", "stack");


1

2 seçeneğiniz var. String.Format'ı kullanabilir veya birleştirme operatörünü kullanabilirsiniz.

String newString = String.Format("I inserted this string {0} into this one", oldstring);

VEYA

String newString = "I inserted this string " + oldstring + " into this one";

Kapakların altında String.Format()StringBuilder kullanılır. StringBuilder, çok sayıda dizeyi birleştirirken genellikle daha etkilidir ancak birleştirme operatörü tek seferlik işlemler için mükemmeldir. String.Format()çıktıya biçimlendirmenin uygulanması gerektiğinde, örneğin sayısal değerlere dolgu veya baştaki sıfırlar eklemek için kullanışlıdır. Dolayısıyla String.Format(), bir döngü içinde kullanmak , potansiyel olarak çok sayıda StringBuilders başlatır. Bu durumda, döngünün dışında ve döngünün AppendFormat()içinde bildirilmiş tek bir StringBuilder kullanmak daha iyidir .
David Clarke

1

Dizeyle yer tutucuları uygulamanın bir yolu daha var. Değiştir, garip bir şekilde bazı durumlarda yardımcı olur:

mystr = mystr.Replace("%soverflow", strVar);

1

Aşağıdaki yolu kullanabilirsiniz

Dize enterpolasyonu

$ Özel karakteri, bir dizgeyi enterpolasyonlu bir dize olarak tanımlar. Örneğin

string name = "Mark";
string surname = "D'souza";
WriteLine($"Name :{name} Surname :{surname}" );//Name :Mark Surname :D'souza  

Enterpolasyonlu bir dize, enterpolasyonlu ifadeler içerebilen bir dizedir. Enterpolasyonlu bir dize bir sonuç dizesine çözümlendiğinde, enterpolasyonlu ifadelere sahip öğeler, ifade sonuçlarının dize temsilleriyle değiştirilir.

String.Format

Bir nesnenin, değişkenin veya ifadenin değerini başka bir dizeye eklemeniz gerekiyorsa String.Format kullanın.

WriteLine(String.Format("Name: {0}, Surname : {1}", name, surname));

0

Kullanım:

strVar = "stack"
mystr  = String.Format("This is {0}", strVar);

0

Bunu Expansive ile başarabilirsiniz: https://github.com/anderly/Expansive


C # yerleşik bir enterpolasyon mekanizmasına sahiptir. Bu işlevsellik için bir kitaplık eklemenin kesinlikle hiçbir nedeni yoktur.
Görünen ad

2
@ Displayname sorudaki tarihe bakın. C # her zaman yerleşik dize enterpolasyonuna sahip değildi. O 2014 yılında, Dolayısıyla 2016 yılında C # 6'da cevabım nedenini eklendi
anderly
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.