반응형
알고리즘 문제풀이 중 문자열을 뒤집고 싶었고 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" 값을 확인할 수 있다.
반응형