Jak interpolować ciągi?

106

Chcę wykonać następujące czynności w języku C # (pochodzącym z tła Pythona):

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

Jak zamienić token w ciągu na wartość znajdującą się poza nim?

sazr
źródło

Odpowiedzi:

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

Możesz także użyć nazwanych parametrów zamiast indeksów.

Darin Dimitrov
źródło
270

To zostało dodane w C # 6,0 (Visual Studio 2015+).

Przykład:

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

To jest cukier syntaktyczny do:

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

Dodatkowe zasoby:

Interpolacja ciągów dla dyskusji w języku C # (v2)

Podgląd języka C # 6.0

Ashtonian
źródło
Łatka dla mono (z 2009 r., Twój przebieg może się różnić) tirania.org/blog/archive/2009/Dec-20.html
Jefferey Cave
1
Dla użytkowników monofonicznych: stackoverflow.com/questions/29208869/…
Jefferey Cave
Ta funkcja jest taka piękna. Zwłaszcza z VS2015 i obsługą edytora, dzięki czemu można wyraźnie zobaczyć interpolowane ciągi i uzyskać inteligencję. Działa nawet z metodami! $("This feature is {GetDescription(FEATURE_AMAZING))}");
Patrick
14

Możesz użyć, string.Formataby upuścić wartości w ciągach:

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

Alternatywą jest użycie operatora konkatenacji C #:

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

Jeśli wykonujesz dużo konkatenacji, użyj StringBuilderbardziej wydajnej klasy:

var strVar = "stack";
var stringBuilder = new StringBuilder("This is ");
for (;;)
{
    stringBuilder.Append(strVar); // spot the deliberate mistake ;-)
}
stringBuilder.Append("overflow");
var myStr = stringBuilder.ToString();
David Clarke
źródło
12

C # 6.0

string mystr = $"This is {strVar}overflow";
Sylvain Rodrigue
źródło
12

Jeśli obecnie używasz programu Visual Studio 2015 z C # 6.0, spróbuj wykonać następujące czynności:

var strVar = "stack";

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

ta funkcja nazywa się interpolacją ciągów.

Sakal
źródło
6

Nie ma do tego operatora. Musisz użyć string.Format.

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

Niestety string.Formatjest to metoda statyczna, więc nie można po prostu pisać "This is {0}soverflow".Format(strVar). Niektórzy ludzie zdefiniowali metodę rozszerzenia, która pozwala na taką składnię.

CodesInChaos
źródło
5

Zastosowanie string.Format:

string mystr = string.Format("This is {0}overflow", "stack");
Matthew Abbott
źródło
1

Masz 2 opcje. Możesz użyć String.Format lub możesz użyć operatora konkatenacji.

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

LUB

String newString = "I inserted this string " + oldstring + " into this one";
DwayneAllen
źródło
Pod okładkami String.Format()używa StringBuilder. StringBuilder jest zwykle bardziej wydajny podczas konkatenacji wielu ciągów, ale operator konkatenacji jest idealny do jednorazowych. String.Format()przydaje się, gdy na wyjściu trzeba zastosować formatowanie, np. aby dodać dopełnienie lub zera wiodące do wartości liczbowych. Tak więc użycie String.Format()w pętli potencjalnie spowoduje utworzenie wielu obiektów StringBuilders. W takiej sytuacji lepiej jest użyć pojedynczego StringBuildera zadeklarowanego na zewnątrz pętli i AppendFormat()wewnątrz pętli.
David Clarke
1

Jest jeszcze jeden sposób na zaimplementowanie symboli zastępczych za pomocą ciągu znaków. Zamień, co dziwnie pomaga w niektórych sytuacjach:

mystr = mystr.Replace("%soverflow", strVar);
Talha Imam
źródło
1

Możesz skorzystać z następującego sposobu

Interpolacja ciągów

Znak specjalny $ identyfikuje literał ciągu jako łańcuch interpolowany. na przykład

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

Ciąg interpolowany to literał ciągu, który może zawierać wyrażenia interpolowane. Gdy interpolowany ciąg jest tłumaczony na ciąg wynikowy, elementy z interpolowanymi wyrażeniami są zastępowane ciągami reprezentującymi wyniki wyrażenia.

String.Format

Użyj String.Format, jeśli chcesz wstawić wartość obiektu, zmiennej lub wyrażenia do innego ciągu

WriteLine(String.Format("Name: {0}, Surname : {1}", name, surname));
Sunil Dhappadhule
źródło
0

Posługiwać się:

strVar = "stack"
mystr  = String.Format("This is {0}", strVar);
Phillip Ngan
źródło
0

Możesz to osiągnąć dzięki Expansive: https://github.com/anderly/Expansive

anderly
źródło
C # ma wbudowany mechanizm interpolacji. Nie ma absolutnie żadnego powodu, aby dołączać bibliotekę do tej funkcji.
Wyświetlana nazwa
2
@Displayname spójrz na datę w pytaniu. Język C # nie zawsze miał wbudowaną interpolację ciągów. Został dodany w C # 6 w 2016 roku. Stąd powód mojej odpowiedzi w 2014.
anderly