Jak interpolować ciągi?


106

Chcę wykonać następujące czynności w języku C # (pochodzącym z tła Pythona):

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

Jak zamienić token w ciągu na wartość znajdującą się poza nim?

Odpowiedzi:



270

To zostało dodane w C # 6,0 (Visual Studio 2015+).

Przykład:

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

To jest cukier syntaktyczny do:

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

Dodatkowe zasoby:

Interpolacja ciągów dla dyskusji w języku C # (v2)

Podgląd języka C # 6.0


Łatka dla mono (z 2009 r., Twój przebieg może się różnić) tirania.org/blog/archive/2009/Dec-20.html
Jefferey Cave

1
Dla użytkowników monofonicznych: stackoverflow.com/questions/29208869/…
Jefferey Cave

Ta funkcja jest taka piękna. Zwłaszcza z VS2015 i obsługą edytora, dzięki czemu można wyraźnie zobaczyć interpolowane ciągi i uzyskać inteligencję. Działa nawet z metodami! $("This feature is {GetDescription(FEATURE_AMAZING))}");
Patrick

14

Możesz użyć, string.Formataby upuścić wartości w ciągach:

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

Alternatywą jest użycie operatora konkatenacji C #:

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

Jeśli wykonujesz dużo konkatenacji, użyj StringBuilderbardziej wydajnej klasy:

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

Jeśli obecnie używasz programu Visual Studio 2015 z C # 6.0, spróbuj wykonać następujące czynności:

var strVar = "stack";

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

ta funkcja nazywa się interpolacją ciągów.


6

Nie ma do tego operatora. Musisz użyć string.Format.

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

Niestety string.Formatjest to metoda statyczna, więc nie można po prostu pisać "This is {0}soverflow".Format(strVar). Niektórzy ludzie zdefiniowali metodę rozszerzenia, która pozwala na taką składnię.




1

Masz 2 opcje. Możesz użyć String.Format lub możesz użyć operatora konkatenacji.

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

LUB

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

Pod okładkami String.Format()używa StringBuilder. StringBuilder jest zwykle bardziej wydajny podczas konkatenacji wielu ciągów, ale operator konkatenacji jest idealny do jednorazowych. String.Format()przydaje się, gdy na wyjściu trzeba zastosować formatowanie, np. aby dodać dopełnienie lub zera wiodące do wartości liczbowych. Tak więc użycie String.Format()w pętli potencjalnie spowoduje utworzenie wielu obiektów StringBuilders. W takiej sytuacji lepiej jest użyć pojedynczego StringBuildera zadeklarowanego na zewnątrz pętli i AppendFormat()wewnątrz pętli.
David Clarke

1

Jest jeszcze jeden sposób na zaimplementowanie symboli zastępczych za pomocą ciągu znaków. Zamień, co dziwnie pomaga w niektórych sytuacjach:

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

1

Możesz skorzystać z następującego sposobu

Interpolacja ciągów

Znak specjalny $ identyfikuje literał ciągu jako łańcuch interpolowany. na przykład

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

Ciąg interpolowany to literał ciągu, który może zawierać wyrażenia interpolowane. Gdy interpolowany ciąg jest tłumaczony na ciąg wynikowy, elementy z interpolowanymi wyrażeniami są zastępowane ciągami reprezentującymi wyniki wyrażenia.

String.Format

Użyj String.Format, jeśli chcesz wstawić wartość obiektu, zmiennej lub wyrażenia do innego ciągu

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


0

Możesz to osiągnąć dzięki Expansive: https://github.com/anderly/Expansive


C # ma wbudowany mechanizm interpolacji. Nie ma absolutnie żadnego powodu, aby dołączać bibliotekę do tej funkcji.
Wyświetlana nazwa

2
@Displayname spójrz na datę w pytaniu. Język C # nie zawsze miał wbudowaną interpolację ciągów. Został dodany w C # 6 w 2016 roku. Stąd powód mojej odpowiedzi w 2014.
anderly
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.