Como faço para interpolar strings?

106

Eu quero fazer o seguinte em C # (vindo de um plano de fundo Python):

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

Como substituo o token dentro da string pelo valor fora dela?

Sazr
fonte

Respostas:

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

E você também pode usar parâmetros nomeados em vez de índices.

Darin Dimitrov
fonte
270

Isso foi adicionado a partir do C # 6.0 (Visual Studio 2015+).

Exemplo:

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

Este é o açúcar sintático para:

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

Recursos adicionais:

Interpolação de string para discussão C # (v2)

Visualização da linguagem C # 6.0

Ashtonian
fonte
Patch para mono (datado de 2009, sua milhagem pode variar) tirania.org/blog/archive/2009/Dec-20.html
Jefferey Cave
1
Para os usuários mono: stackoverflow.com/questions/29208869/…
Jefferey Cave
Esse recurso é uma coisa tão bonita. Especialmente com o VS2015 e o suporte do editor para que você possa ver claramente as strings interpoladas e obter o intellisense. Funciona até com métodos! $("This feature is {GetDescription(FEATURE_AMAZING))}");
Patrick
14

Você pode usar string.Formatpara soltar valores em strings:

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

Uma alternativa é usar o operador de concatenação C #:

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

Se você estiver fazendo muitas concatenações, use a StringBuilderclasse que é mais eficiente:

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

C # 6.0

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

Se você atualmente usa o Visual Studio 2015 com C # 6.0, tente o seguinte:

var strVar = "stack";

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

esse recurso é chamado de interpolação de string.

Sakal
fonte
6

Não há operadora para isso. Você precisa usar string.Format.

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

Infelizmente, string.Formaté um método estático, então você não pode simplesmente escrever "This is {0}soverflow".Format(strVar). Algumas pessoas definiram um método de extensão, que permite essa sintaxe.

CodesInChaos
fonte
5

Use string.Format:

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

Você deveria estar usando String.Format(). A sintaxe é um pouco diferente; em vez disso, são usados ​​marcadores numéricos.

Exemplo:

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

Dê uma olhada em http://msdn.microsoft.com/en-us/library/system.string.format.aspx para mais detalhes.

Bruno silva
fonte
1

Você tem 2 opções. Você pode usar String.Format ou pode usar o operador de concatenação.

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

OU

String newString = "I inserted this string " + oldstring + " into this one";
DwayneAllen
fonte
Nos String.Format()bastidores usa StringBuilder. StringBuilder é normalmente mais eficiente ao concatenar muitas strings, mas o operador de concatenação é perfeito para uma única vez. String.Format()é útil quando a formatação precisa ser aplicada à saída, por exemplo, para adicionar preenchimento ou zeros à esquerda a valores numéricos. Portanto, o uso String.Format()em um loop irá potencialmente instanciar muitos StringBuilders. Nessa situação, é melhor usar um único StringBuilder declarado fora do loop e AppendFormat()dentro do loop.
David Clarke
1

Há mais uma maneira de implementar marcadores de posição com string. Substitua, estranhamente ajuda em certas situações:

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

Você pode usar a seguinte maneira

Interpolação de string

O caractere especial $ identifica uma string literal como uma string interpolada. por exemplo

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

Uma string interpolada é uma string literal que pode conter expressões interpoladas. Quando uma string interpolada é resolvida em uma string de resultado, os itens com expressões interpoladas são substituídos pelas representações de string dos resultados da expressão.

String.Format

Use String.Format se precisar inserir o valor de um objeto, variável ou expressão em outra string.Eg

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

Usar:

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

Você pode fazer isso com o Expansive: https://github.com/anderly/Expansive

Anderly
fonte
C # tem um mecanismo de interpolação embutido. Não há absolutamente nenhuma razão para incluir uma biblioteca para esta funcionalidade.
Nome de exibição
2
@Displayname veja a data na questão. C # nem sempre tem interpolação de string embutida. Foi adicionado no C # 6 em 2016. Daí, o motivo da minha resposta em 2014.
apenas