замена "z" на "w" и наоборот в с#

Рейтинг: 1Ответов: 3Опубликовано: 03.02.2023

Как заменить "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);

Ответы

▲ 2
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);

но я бы не заморачивался и писал бы первым.

Но в общем-то можно сделать значительно оптимальнее чем оба кода но... для чего?

▲ 2

У меня сердце кровью обливается, когда я вижу создание множества ненужных промежуточных строк.

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

▲ -1

Отвечу как новичок новичку. Встречно два метода Replace не отработают. Они будут выполняться друг за другом последовательно. Поэтому для решения задачи в данном случае можно просто сделать так:

string s = Console.ReadLine();

s = s.Replace('z','x').Replace('w', 'z').Replace('x', 'w');

Console.WriteLine(s);