замена "z" на "w" и наоборот в с#
Как заменить "z" на "w" и наоборот? Пробовал все возможные методы с Replace, но никак не получается. Не понимаю как работает Replace.
Я хочу, что бы при вводе строки, в которой есть символы "z" или "w".
Выводилась строка, где эти два символа заменены друг другом.
Примеры:
Ввод: zebrowwka.
Вывод: webrozzka.
Ввод: zzz 121 www.
Вывод: www 121 zzz
string str = Console.ReadLine();
string letter = "z";
string letterw = "w";
string a = "z";
string b = "w";
string result = str.Replace(letter, letterw).Replace(b, a);
Ответы (3 шт):
var tempStr = $"{Guid.NewGuid()}1%^!2@#%^)(5&@#$%^6#@!^7#$8%^";
var result = str.Replace("z",tempStr)
.Replace("w", "z")
.Replace(tempStr, "w");
tempStr необходим что бы уберечься от ситуации где в строке будет едининичный временный символ который мы используем. Весьма сомневаюсь что такая стремная кобминация спецсимволов и цифр будет часто встречатся в текстах
Что б люди в комментариях не занудствовали вот второй вариант:
var str = "zzz 121 www";
var tmp = str.Split('z').Select(x => x.Replace("w", "z")).ToArray();
var rez = String.Join("w", tmp);
но я бы не заморачивался и писал бы первым.
Но в общем-то можно сделать значительно оптимальнее чем оба кода но... для чего?
У меня сердце кровью обливается, когда я вижу создание множества ненужных промежуточных строк.
Делаем замену за один проход по строке. Используется промежуточный StringBuilder.
var sb = new StringBuilder(str.Length);
for (int i = 0; i < str.Length; i++)
{
if (str[i] == 'z')
sb.Append('w');
else if (str[i] == 'w')
sb.Append('z');
else
sb.Append(str[i]);
}
var result = sb.ToString();
Набор if-else можно заменить на паттерн-матчинг:
sb.Append(str[i] switch { 'z' => 'w', 'w' => 'z', _ => str[i] });
Правда, этот способ работает только в случае замены одного символа на другой один символ.
P.S. Можно ещё небезопасный код с указателями задействовать, тогда вообще без дополнительной памяти можно обойтись.
Отвечу как новичок новичку. Встречно два метода Replace не отработают. Они будут выполняться друг за другом последовательно. Поэтому для решения задачи в данном случае можно просто сделать так:
string s = Console.ReadLine();
s = s.Replace('z','x').Replace('w', 'z').Replace('x', 'w');
Console.WriteLine(s);