2012-02-19 4 views
91

voglio fare quanto segue in C# (proveniente da un background Python):Come faccio a interpolare le stringhe?

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

Come si sostituisce il token all'interno della stringa con il valore al di fuori di esso?

risposta

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

E potresti anche utilizzare named parameters anziché gli indici.

5

Non esiste un operatore per questo. È necessario utilizzare string.Format.

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

Purtroppo string.Format è un metodo statico, quindi non si può semplicemente scrivere "This is {0}soverflow".Format(strVar). Alcune persone hanno definito un metodo di estensione, che consente questa sintassi.

4

Uso string.Format:

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

Usa:

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

Hai 2 opzioni. È possibile utilizzare String.Format oppure è possibile utilizzare l'operatore di concatenazione.

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

O

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

Sotto le coperte 'String.Format()' usa StringBuilder. StringBuilder è in genere più efficiente quando si concatenano molte stringhe, ma l'operatore di concatenazione è perfetto per uno. 'String.Format()' è utile quando la formattazione deve essere applicata all'output, ad es. aggiungere padding o zeri iniziali a valori numerici. Quindi l'uso di 'String.Format()' in un loop potenzialmente istanzia un sacco di StringBuilder. In questa situazione è meglio usare un singolo StringBuilder dichiarato al di fuori del ciclo e 'AppendFormat()' all'interno del ciclo. –

13

È possibile utilizzare string.Format far cadere i valori in stringhe:

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

Un'alternativa è quella di usare l'operatore di C# di concatenazione:

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

Se stai facendo un sacco di concatenazioni utilizzano la classe StringBuilder che è più efficiente:

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

Questo è stato aggiunto come di C# 6.0 (Visual Studio 2015+).

Esempio:

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

Questo è zucchero sintattico per:

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

Risorse aggiuntive:

String Interpolation for C# (v2) Discussion

C# 6.0 Language Preview

+0

Patch per mono (datato 2009, il tuo chilometraggio può variare) http://tirania.org/blog/archive/2009/Dec-20.html –

+1

Per gli utenti mono: http://stackoverflow.com/questions/29208869/c-sharp-6-0-string-interpolation-in-mono-mcs –

+0

Questa funzione è davvero meravigliosa. Soprattutto con VS2015 e il supporto dell'editor in modo da poter vedere chiaramente le stringhe interpolate e ottenere intellisense. Funziona anche con i metodi! '$ (" Questa funzione è {GetDescription (FEATURE_AMAZING))} ");' – Patrick

6

Se attualmente si utilizza Visual Studio 2015 con C# 6.0, provare quanto segue:

var strVar = "stack"; 

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

questa funzione è chiamato stringa di interpolazione.

+4

Non è solo 'string str = $" Questo è {strVar} OverFlow ";'? –

+0

Questo non è un codice di compilazione poiché dà 'CS1009 \t Sequenza di escape non riconosciuta' – guneysus

+0

questo sta iniziando C# 6.0 solo @guneysus –

0

C'è un altro modo per implementare i segnaposto con String.Replace, aiuta stranamente in determinate situazioni:

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