본문 바로가기

Programming/C#

C# reverse string use linq

반응형

 

알고리즘 문제풀이 중 문자열을 뒤집고 싶었고 Reverse 함수가 있길래 별생각 없이 사용했다가 문제를 발견했다.

string.Reverse()의 결과가 예상과 다르다

 

 간략한 예제로 아래 코드에 대한 내 예상결과는 "tseT"였다.

string word = "Test";

Debug.Write(word.Reverse());

 

하지만 실제 결과는 타입 정보 문자열이 출력되고 있다.

 

원인해결방법은 아래와 같다.

 

원인

Reverse 메서드를 F12(정의로 이동)로 확인해보니 음..? 

Linq에 있는 Enumerable 클래스의 Reverse 메서드였다.

public static IEnumerable<TSource> Reverse<TSource>(this IEnumerable<TSource> source);

 

즉, string 타입이 기본으로 제공하는 Reverse 메서드가 없었고 Enumerable의 확장(extension) Reverse 메서드를 사용한 것이다. 

아래는 참고차 가져온 string 정의 부분이다.

string은 IEnumerable<char>를 구현하고 있다.

public sealed class String : IEnumerable<char>, IEnumerable, ICloneable, IComparable, IComparable<String>, IConvertible, IEquatable<String>

 

그럼 Enumerable의 Reverse 메서드를 썼을 때 나오는 결과가 이상한 것은 왜일까?

 

Reverse 메서드의 리턴 타입은 IEnumerable<TSource>이다.

좀 더 정확히 위 케이스에선 IEnumerable<char> 일 것인데

해당 타입의 ToString() 구현이 없어 최상위 Object 클래스의 ToString()을 사용하게 된 결과이다.

 

해결방법

아래 코드를

string word = "Test";

Debug.Write(word.Reverse());

아래와 같이 바꾼다.

IEnumerable<char>을 char array로 바꿔주고 그걸 이용해 새로운 string 인스턴스를 만드는 방식이다.

string word = "Test";

Debug.Write(new string(word.Reverse().ToArray()));

 

출력해보면 아래와 같이 예상하던 "tseT" 값을 확인할 수 있다.

반응형