C # заменить строку в строке - PullRequest
       4

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

13 голосов
/ 04 августа 2011

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

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

string test = "Hello [REPLACE] world";

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

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

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

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

Ответы [ 7 ]

27 голосов
/ 04 августа 2011

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

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

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

24 голосов
/ 04 августа 2011

Как уже упоминалось 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"
2 голосов
/ 04 августа 2011

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

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

2 голосов
/ 04 августа 2011

Вы не можете. Вы должны присвоить значение, так как строки неизменны

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

1 голос
/ 04 августа 2011

Вы не можете, в C # строки являются неизменяемыми.Нечто подобное нарушит это.Вам нужно иметь возвращаемый тип строки, потому что тот, с которым вы работаете, не может измениться.

1 голос
/ 04 августа 2011

Нельзя, строки неизменны в .NET

0 голосов
/ 16 июня 2017

Вот код для извлечения строки из 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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...