Як інтерполювати рядки?


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/…
Джеффірі Печера

Ця особливість така гарна річ. Особливо з VS2015 та підтримкою редактора, щоб ви могли чітко бачити інтерпольовані рядки та отримувати інтелігенцію. Це навіть працює методами! $("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

Є ще один спосіб реалізувати заповнювачі за допомогою рядка. Замініть, що це дивно допомагає в певних ситуаціях:

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 р.
anderly
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.