Как интерполировать строки?


106

Я хочу сделать следующее на C # (исходя из фона Python):

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

Как заменить токен внутри строки на значение вне ее?

Ответы:



270

Это было добавлено в C # 6.0 (Visual Studio 2015+).

Пример:

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

Это синтаксический сахар для:

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

Дополнительные ресурсы:

Обсуждение строковой интерполяции для C # (v2)

Предварительный просмотр языка C # 6.0


Патч для моно (датирован 2009 годом, ваш пробег может отличаться) tirania.org/blog/archive/2009/Dec-20.html
Jefferey Cave

1
Для пользователей моно: stackoverflow.com/questions/29208869/…
Jefferey Cave 08

Эта функция такая красивая. Особенно с VS2015 и поддержкой редактора, поэтому вы можете четко видеть интерполированные строки и получать intellisense. Он даже работает с методами! $("This feature is {GetDescription(FEATURE_AMAZING))}");
Патрик

14

Вы можете использовать string.Formatдля перетаскивания значений в строки:

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

Альтернативой является использование оператора конкатенации C #:

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

Если вы выполняете много конкатенаций, используйте StringBuilderболее эффективный класс:

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


12

Если в настоящее время вы используете Visual Studio 2015 с C # 6.0, попробуйте следующее:

var strVar = "stack";

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

эта функция называется строковой интерполяцией.


6

Для этого нет оператора. Вам нужно использовать string.Format.

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

К сожалению string.Format, это статический метод, поэтому вы не можете просто писать "This is {0}soverflow".Format(strVar). Некоторые люди определили метод расширения, который позволяет использовать этот синтаксис.




1

У вас есть 2 варианта. Вы можете использовать String.Format или оператор конкатенации.

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

ИЛИ

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

Под обложками String.Format()использует StringBuilder. StringBuilder обычно более эффективен при конкатенации большого количества строк, но оператор конкатенации идеально подходит для одноразовых. String.Format()полезен, когда необходимо применить форматирование к выходным данным, например, чтобы добавить заполнение или начальные нули к числовым значениям. Таким образом, использование String.Format()в цикле потенциально может создать множество StringBuilders. В этой ситуации лучше использовать один StringBuilder, объявленный вне цикла и AppendFormat()внутри цикла.
Дэвид Кларк

1

Есть еще один способ реализовать заполнители с помощью string.Replace, как ни странно, помогает в определенных ситуациях:

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

1

Вы можете использовать следующий способ

Строчная интерполяция

Специальный символ $ определяет строковый литерал как интерполированную строку. например

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

Интерполированная строка - это строковый литерал, который может содержать интерполированные выражения. Когда интерполированная строка преобразуется в строку результата, элементы с интерполированными выражениями заменяются строковыми представлениями результатов выражения.

String.Format

Используйте String.Format, если вам нужно вставить значение объекта, переменной или выражения в другую строку.

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


0

Вы можете сделать это с помощью Expansive: https://github.com/anderly/Expansive


В C # есть встроенный механизм интерполяции. Нет абсолютно никаких причин включать библиотеку для этой функции.
Отображаемое имя

2
@Displayname посмотрите дату на вопросе. В C # не всегда была встроенная интерполяция строк. Он был добавлен в C # 6 в 2016 году. Следовательно, причина моего ответа в 2014 году
ранее
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.