С# заменить строку в строке
Можно ли заменить подстроку в строке без присвоения возвращаемого значения?
У меня есть строка:
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"
Ответ 3
Вы не можете. Вы должны назначить значение, поскольку строки являются неизменяемыми.
http://msdn.microsoft.com/en-us/library/362314fe.aspx
Ответ 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());