С# заменить строку в строке

Можно ли заменить подстроку в строке без присвоения возвращаемого значения?

У меня есть строка:

string test = "Hello [REPLACE] world";

и я хочу заменить подстроку [REPLACE] на что-то еще:

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

Это отлично работает, но как я могу это сделать, не присваивая возвращаемое значение переменной? Я хочу что-то вроде этого:

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

Ответ 1

Вы не можете, потому что string является неизменным. Он был спроектирован таким образом, чтобы любые "изменения" в строке фактически привели к созданию нового объекта string. Таким образом, если вы не назначаете возвращаемое значение (которое является "обновленной" строкой, фактически копией исходной строки с внесенными изменениями), вы фактически отменили изменения, которые вы хотели сделать.

Если вы хотите внести изменения на месте, теоретически можете работать с char[] (массив символов), но это опасно, и его следует избегать.

Другой вариант (как указывает г-н Скит ниже) - использовать StringBuilder и его метод Replace(). При этом простые замены, такие как те, которые вы показали, довольно быстр, поэтому вы можете не захотеть беспокоиться о StringBuilder, если вы не будете делать это довольно часто.

Ответ 2

Как уже упоминалось, dlev, вы не можете сделать это с помощью string, поскольку строки неизменны в .NET. После того, как строка была построена, вы ничего не можете сделать (исключая небезопасный код или отражение), чтобы изменить содержимое. Это упрощает работу с цепочками, так как вам не нужно беспокоиться об защитном копировании, они, естественно, являются потокобезопасными и т.д.

Его изменчивый кузен, однако, 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"

Ответ 4

Вы не можете, строки неизменяемы в .NET

Ответ 5

Строки в .NET неизменяемы, их нельзя редактировать в строке.

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

Ответ 6

Вы не можете, в С# строки неизменяемы. Что-то вроде этого нарушит это. Вы должны иметь тип возвращаемого типа, потому что тот, с которым вы работаете, не может измениться.

Ответ 7

Вот код для извлечения строки из html и передачи ее StringBuilder и установки значения из вашей переменной. Вы не можете выполнить string.replace. Вы должны использовать StringBuilder во время манипуляции. Здесь, на странице html, я добавляю [Name], которое заменяется по имени из кода позади. Убедитесь, что [Имя] уникально, или вы можете дать любое уникальное имя.

 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());