¿Cómo interpolo cadenas?

106

Quiero hacer lo siguiente en C # (proveniente de un fondo de Python):

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

¿Cómo reemplazo el token dentro de la cadena con el valor fuera de ella?

sazr
fuente

Respuestas:

270

Esto se ha agregado a partir de C # 6.0 (Visual Studio 2015+).

Ejemplo:

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 es azúcar sintáctico para:

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

Recursos adicionales:

Interpolación de cadenas para discusión de C # (v2)

Vista previa del lenguaje C # 6.0

Ashtoniano
fuente
Parche para mono (con fecha de 2009, su millaje puede variar) tirania.org/blog/archive/2009/Dec-20.html
Jefferey Cave
1
Para los usuarios mono: stackoverflow.com/questions/29208869/…
Jefferey Cave
Esta característica es algo tan hermoso. Especialmente con VS2015 y el soporte del editor para que pueda ver claramente las cadenas interpoladas y obtener intellisense. ¡Incluso funciona con métodos! $("This feature is {GetDescription(FEATURE_AMAZING))}");
Patrick
14

Puede usar string.Formatpara colocar valores en cadenas:

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

Una alternativa es usar el operador de concatenación de C #:

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

Si está haciendo muchas concatenaciones, use la StringBuilderclase que es más 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
fuente
12

C # 6.0

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

Si actualmente usa Visual Studio 2015 con C # 6.0, intente lo siguiente:

var strVar = "stack";

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

esa característica se llama interpolación de cadenas.

Sakal
fuente
6

No hay operador para eso. Necesitas usar string.Format.

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

Desafortunadamente, string.Formates un método estático, por lo que no puede simplemente escribir "This is {0}soverflow".Format(strVar). Algunas personas han definido un método de extensión que permite esta sintaxis.

CódigosInChaos
fuente
5

Utilizar string.Format:

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

Tienes 2 opciones. Puede usar String.Format o puede usar el operador de concatenación.

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

O

String newString = "I inserted this string " + oldstring + " into this one";
DwayneAllen
fuente
Bajo las sábanas String.Format()usa StringBuilder. StringBuilder suele ser más eficiente cuando se concatenan muchas cadenas, pero el operador de concatenación es perfecto para una sola. String.Format()es útil cuando es necesario aplicar formato a la salida, por ejemplo, para agregar relleno o ceros iniciales a valores numéricos. Entonces, usarlo String.Format()en un bucle potencialmente instanciará muchos StringBuilders. En esa situación, es mejor usar un solo StringBuilder declarado fuera del ciclo y AppendFormat()dentro del ciclo.
David Clarke
1

Hay una forma más de implementar marcadores de posición con cadenas. Reemplazar, extrañamente ayuda en ciertas situaciones:

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

Puedes usar la siguiente forma

Interpolación de cadenas

El carácter especial $ identifica una cadena literal como una cadena interpolada. p.ej

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

Una cadena interpolada es un literal de cadena que puede contener expresiones interpoladas. Cuando una cadena interpolada se resuelve en una cadena de resultado, los elementos con expresiones interpoladas se reemplazan por las representaciones de cadena de los resultados de la expresión.

String.Format

Utilice String.Format si necesita insertar el valor de un objeto, variable o expresión en otra cadena.

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

Utilizar:

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

Puede lograr esto con Expansive: https://github.com/anderly/Expansive

anciano
fuente
C # tiene un mecanismo de interpolación integrado. No hay absolutamente ninguna razón para incluir una biblioteca para esta funcionalidad.
Nombre para mostrar
2
@Displayname mira la fecha de la pregunta. C # no siempre tuvo interpolación de cadenas incorporada. Se agregó en C # 6 en 2016. Por lo tanto, la razón de mi respuesta en 2014.
anderly