Wie interpoliere ich Strings?

106

Ich möchte in C # (aus einem Python-Hintergrund) Folgendes tun:

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

Wie ersetze ich das Token innerhalb der Zeichenfolge durch den Wert außerhalb der Zeichenfolge?

sazr
quelle

Antworten:

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

Sie können auch benannte Parameter anstelle von Indizes verwenden.

Darin Dimitrov
quelle
270

Dies wurde ab C # 6.0 (Visual Studio 2015+) hinzugefügt.

Beispiel:

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

Dies ist syntaktischer Zucker für:

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

Zusätzliche Ressourcen:

String-Interpolation für C # (v2) -Diskussion

C # 6.0 Sprachvorschau

Ashtonian
quelle
Patch für Mono (datiert 2009, Ihr Kilometerstand kann variieren) tirania.org/blog/archive/2009/Dec-20.html
Jefferey Cave
1
Für die Mono-Benutzer: stackoverflow.com/questions/29208869/…
Jefferey Cave
Diese Funktion ist so eine schöne Sache. Insbesondere mit VS2015 und der Editorunterstützung können Sie die interpolierten Zeichenfolgen klar erkennen und Intellisense erhalten. Es funktioniert sogar mit Methoden! $("This feature is {GetDescription(FEATURE_AMAZING))}");
Patrick
14

Sie können verwenden string.Format, um Werte in Zeichenfolgen abzulegen:

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

Eine Alternative ist die Verwendung des C # -Verkettungsoperators:

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

Wenn Sie viele Verkettungen durchführen, verwenden Sie die StringBuilderKlasse, die effizienter ist:

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
quelle
12

C # 6.0

string mystr = $"This is {strVar}overflow";
Sylvain Rodrigue
quelle
12

Wenn Sie derzeit Visual Studio 2015 mit C # 6.0 verwenden, versuchen Sie Folgendes:

var strVar = "stack";

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

Diese Funktion wird als Zeichenfolgeninterpolation bezeichnet.

Sakal
quelle
6

Dafür gibt es keinen Operator. Sie müssen verwenden string.Format.

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

Leider string.Formatist eine statische Methode, so dass Sie nicht einfach schreiben können "This is {0}soverflow".Format(strVar). Einige Leute haben eine Erweiterungsmethode definiert, die diese Syntax erlaubt.

CodesInChaos
quelle
5

Verwendung string.Format:

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

Sie sollten verwenden String.Format(). Die Syntax ist etwas anders, stattdessen werden numerische Platzhalter verwendet.

Beispiel:

String.Format("item {0}, item {1}", "one", "two")

Werfen Sie einen Blick auf http://msdn.microsoft.com/en-us/library/system.string.format.aspx für weitere Details.

Bruno Silva
quelle
1

Sie haben 2 Möglichkeiten. Sie können entweder String.Format oder den Verkettungsoperator verwenden.

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

ODER

String newString = "I inserted this string " + oldstring + " into this one";
DwayneAllen
quelle
Unter der Decke String.Format()verwendet StringBuilder. StringBuilder ist normalerweise effizienter, wenn viele Zeichenfolgen verkettet werden, aber der Verkettungsoperator eignet sich perfekt für einmalige Zeichenfolgen. String.Format()ist nützlich, wenn die Ausgabe formatiert werden muss, z. B. um numerischen Werten Auffüllungen oder führende Nullen hinzuzufügen. Die Verwendung String.Format()in einer Schleife instanziiert möglicherweise viele StringBuilder. In dieser Situation ist es besser, einen einzelnen StringBuilder zu verwenden, der außerhalb der Schleife und AppendFormat()innerhalb der Schleife deklariert ist .
David Clarke
1

Es gibt noch eine Möglichkeit, Platzhalter mit string zu implementieren. Ersetzen, hilft seltsamerweise in bestimmten Situationen:

mystr = mystr.Replace("%soverflow", strVar);
Talha Imam
quelle
1

Sie können den folgenden Weg verwenden

String-Interpolation

Das Sonderzeichen $ kennzeichnet ein Zeichenfolgenliteral als interpolierte Zeichenfolge. z.B

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

Eine interpolierte Zeichenfolge ist ein Zeichenfolgenliteral, das möglicherweise interpolierte Ausdrücke enthält. Wenn eine interpolierte Zeichenfolge in eine Ergebniszeichenfolge aufgelöst wird, werden Elemente mit interpolierten Ausdrücken durch die Zeichenfolgendarstellungen der Ausdrucksergebnisse ersetzt.

String.Format

Verwenden Sie String.Format, wenn Sie den Wert eines Objekts, einer Variablen oder eines Ausdrucks in einen anderen string.Eg einfügen müssen

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

Verwenden:

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

Sie können dies mit Expansive erreichen: https://github.com/anderly/Expansive

anderly
quelle
C # verfügt über einen eingebauten Interpolationsmechanismus. Es gibt absolut keinen Grund, eine Bibliothek für diese Funktionalität einzuschließen.
Anzeigename
2
@Displayname schau dir das Datum auf der Frage an. C # hatte nicht immer eine eingebaute String-Interpolation. Es wurde in C # 6 im Jahr 2016 hinzugefügt. Daher der Grund für meine Antwort im Jahr 2014.
anderly