C#에서 문자열에 포함된 특정 문자들을 서로 맞바꾸고 싶다면 LINQ의 Select 메서드를 활용하는 것이 가장 간단하고 안전한 방법입니다.
문자 교환의 기본 원리
먼저 다음과 같은 문자열이 있다고 가정해 보겠습니다.
string str = "PQRQP";
이 문자열에서 모든 P는 Q로, Q는 P로 교환하려면 Select 메서드와 삼항 연산자(조건 연산자)를 함께 사용하면 됩니다.
str = new string(str.Select(a => a == 'P' ? 'Q' : (a == 'Q' ? 'P' : a)).ToArray());
Select 메서드는 문자열을 한 글자씩 순회하면서, 현재 문자가 'P'이면 'Q'로, 'Q'이면 'P'로 바꾸고 나머지 문자는 그대로 유지합니다. 변환된 결과를 ToArray()로 배열로 만든 뒤 새로운 문자열로 생성하면 교환이 완료됩니다.
참고로 C#의 문자열은 불변(immutable)이므로 기존 문자열을 직접 수정할 수 없습니다. 따라서 반드시 위 코드처럼 새 문자열을 만들어 변수에 다시 할당해야 합니다.
전체 예제 코드
using System;
using System.Linq;
public class Program {
public static void Main() {
string str = "PQRQP";
var res = str.Select(a => a == 'P' ? 'Q' : (a == 'Q' ? 'P' : a)).ToArray();
str = new String(res);
Console.WriteLine(str);
}
}실행 결과
QPRPQ
Replace를 연달아 사용하면 안 되는 이유
str.Replace('P', 'Q').Replace('Q', 'P')처럼 Replace 메서드를 두 번 연결하면 의도대로 동작하지 않습니다. 첫 번째 단계에서 모든 P가 Q로 바뀌기 때문에, 두 번째 단계에서는 원래부터 Q였던 문자까지 함께 P로 되돌아가 버립니다. 각 문자를 개별적으로 조건 판단할 수 있는 Select 방식이 이러한 문제를 깔끔하게 해결해 줍니다.