文字列を補間するにはどうすればよいですか?


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))}");
Patrick

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

現在C#6.0でVisual Studio 2015を使用している場合は、以下を試してください。

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の方が効率的ですが、連結演算子は1回限りの操作に最適です。String.Format()数値にパディングや先行ゼロを追加するなど、出力にフォーマットを適用する必要がある場合に役立ちます。したがってString.Format()、ループで使用すると、多くのStringBuilderがインスタンス化される可能性があります。そのような状況では、ループの外側とループのAppendFormat()内側で宣言された単一のStringBuilderを使用する方が適切です。
デビッドクラーク

1

string.Replaceでプレースホルダーを実装する方法がもう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#には常に文字列補間が組み込まれているとは限りませんでした。それは2014年に、そこで2016年にC#6で私の答えの理由を追加されました
anderly
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.