Как заменить последний символ строки с помощью С#?
string str = "Student_123_";
Мне нужно заменить последний символ "_" на ",". Я сделал это так.
str.Remove(str.Length -1, 1);
str = str + ",";
Однако возможно ли достичь этого более эффективно. может быть одной строкой кода.
Кстати, последним символом может быть любой символ. Так что Replace не будет работать здесь.
Ответы
Ответ 1
Нет.
В строках С# неизменяемы, и поэтому вы не можете изменить строку "на месте". Сначала вы должны удалить часть строки, а затем создать новую строку. На самом деле это также означает, что ваш исходный код неверен, поскольку str.Remove(str.Length -1, 1);
не изменяет str вообще, он возвращает новую строку! Это должно сделать:
str = str.Remove(str.Length -1, 1) + ",";
Ответ 2
С#.NET делает это слишком легко.
str = str.TrimEnd('_')
Ответ 3
Это ограничение работы с string
. Вы можете использовать StringBuilder
, если вам нужно сделать много изменений, подобных этому. Но это не стоит для простой задачи, в которой вы нуждаетесь.
str = str.Substring(0, str.Length - 1) + ",";
Ответ 4
Элегантный, но не очень эффективный.
Заменяет любой символ в конце str запятой.
str = Regex.Replace(str, ".$", ",");
Ответ 5
Использовать класс StringBuilder
StringBuilder mbuilder = new StringBuilder("Student_123_");
mbuilder[mbuilder.Length-1] = ',';
Console.WriteLine(mbuilder.ToString());
Ответ 6
str = str.Substring(0, str.Length-1) + ",";
Ответ 7
Ну, что у вас не получится, потому что str.Remove(...)
не манипулирует str
, он возвращает новую строку с завершенной операцией удаления.
Итак - вам нужно:
str = str.Remove(str.Length-1,1);
str = str + ",";
В плане эффективности есть несколько других вариантов, которые вы могли бы сделать (подстрока, обрезка...), но в конечном итоге вы получите ту же самую сложность времени/пространства.
EDIT:
Кроме того, не пытайтесь раздавить все в одну строку, программисты, которые приходят после вас, оценят большую читаемость. (Хотя в этом случае одна строка также легко читается.) Одна строка!= Более эффективная.
Ответ 8
С одной строкой кода вы можете написать:
str = str.Remove(str.Length - 1, 1) + ",";
Ответ 9
str.Remove
не изменяет str
, он возвращает новую строку. Ваша первая строка должна читать str = str.Remove...
Одна строка? ОК: str = str.Remove(str.Length - 1) + ",";
Я думаю, что так же эффективно, как вы собираетесь. Технически вы создаете две новые строки здесь, а не одну (результат Remove и результат Concatenation). Тем не менее, все, что я могу думать о том, чтобы не создавать две строки, в конечном итоге создает более 1 другого объекта для этого. Вы можете использовать StringBuilder, но это более тяжелый вес, чем дополнительная строка, или, возможно, char[]
, но он все еще является дополнительным объектом, не лучше, чем я уже упоминал выше.