web-dev-qa-db-ja.com

C#文字列内の文字列を置き換える

戻り値を割り当てずに文字列の部分文字列を置き換えることはできますか?

文字列があります:

string test = "Hello [REPLACE] world";

そして、私は部分文字列[REPLACE]を他のもので置き換えたいです:

test = test.replace("[REPLACE]", "test");

これは正常に機能しますが、戻り値を変数に割り当てずにどうすればよいですか?私はこのようなものが欲しい:

test.replace("[REPLACE]", "test");
15
jeb

stringは不変なので、できません。文字列への「変更」が実際に新しいstringオブジェクトを作成するように設計されています。そのため、戻り値(「更新された」文字列、実際には変更が適用された元の文字列のコピー)を割り当てない場合、必要な変更は事実上破棄されています。

インプレース変更を行いたい場合、理論的には_char[]_(文字の配列)を直接操作できますが、これは危険であり、避ける必要があります。

別のオプション(以下のスキート氏が指摘)は、StringBuilderとそのReplace()メソッドを使用することです。そうは言っても、これまでに示したような単純な置換は非常に高速であるため、頻繁に実行するのでない限り、StringBuilderを気にする必要はありません。

27
dlev

Dlevで述べたように、.NETでは文字列がimmutableなので、stringを使用してこれを行うことはできません。 、内容を変更するためにできることは何もありません(安全でないコードやリフレクションを除く)。これにより、一般的に文字列が扱いやすくなります。防御コピーを心配する必要がないため、自然にスレッドセーフになります。

ただし、変更可能な従兄弟は StringBuilder -であり、オブジェクト内置換を実行する Replace メソッドがあります。例えば:

string x = "Hello [first] [second] world";

StringBuilder builder = new StringBuilder(x);
builder.Replace("[first]", "1st");
builder.Replace("[second]", "2nd");

string y = builder.ToString(); // Value of y is "Hello 1st 2nd world"
25
Jon Skeet

.NETの文字列は不変であり、インラインで編集することはできません。

インライン編集に最も近い方法は、文字列からStringBuilderを作成し、その内容をインラインフィドルして、文字列を再度吐き出すことです。ただし、これにより、元の文字列が変更されるのではなく、新しい文字列が生成されます。ただし、多くの文字列を操作するときに、多くの中間文字列を生成しないようにすることは有用なテクニックです。ループで。

2
Paul Ruane

できません。文字列は不変であるため、値を割り当てる必要があります

http://msdn.Microsoft.com/en-us/library/362314fe.aspx

2
CaffGeek

C#では文字列は不変です。このような何かはそれに違反します。処理中の文字列は変更できないため、文字列の戻り値の型が必要です。

1

あなたはできません、文字列は.NETでは不変です

1
Davy8

これは、htmlから文字列をフェッチしてStringBuilderに渡し、変数から値を設定するためのコードです。string.replaceを実行することはできません。操作中にStringBuilderを使用する必要があります。ここで、htmlページで[Name]を追加します。コードの背後にある[名前]が一意であるか、uが一意の名前を付けることができることを確認してください。

 string Name = txtname.Text;
 string contents = File.ReadAllText(Server.MapPath("~/Admin/invoice.html"));

                StringBuilder builder = new StringBuilder(contents);

                builder.Replace("[Name]", Name);

                StringReader sr = new StringReader(builder.ToString());
0