C#/LINQ

[C#]LINQ 거꾸로 뒤집기 - Reverse 메서드

DevStory 2022. 7. 17.

Reverse 메서드

LINQ의 Reverse() 메서드는 원본 데이터를 변경하지 않고 반전된 데이터를 반환합니다. Reverse() 메서드는 System.Linq 및 System.Collections.Generic 네임스페이스에 존재합니다.

 

.Net Framework에서 제공하는 Reverse() 메서드는 두 개이며, 이 둘은 네임스페이스가 다르므로 서로 다른 메서드입니다.

 

우선, System.Linq에 존재하는 Reverse() 메서드는 Enumerable 클래스에서 구현되며 IEnumerable<TSource> 타입을 반환합니다.

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

System.Collections.Generic 네임스페이스에 존재하는 Reverse() 메서드는 void 타입을 반환합니다.

public void Reverse();

Reverse() 메서드가 두 개라는 점을 염두해두고 예제를 살펴봅시다.


예제 1. System.Linq의 Reverse 메서드

먼저, System.Linq의 Reverse() 메서드를 질의 구문과 메서드 구문에서 사용하는 방법입니다.

 

질의 구문

- 질의 구문에서는 Reverse() 메서드를 호출할 수 없으므로 질의 구문의 결과에서 Reverse() 메서드를 호출합니다.

 

메서드 구문

- List 객체에서 Revsere() 메서드를 호출하면 System.Collections.Generic 네임스페이스의 Reverse() 메서드로 인식합니다. System.Linq의 Reverse() 메서드를 호출하기 위해서는 제네릭 타입을 명시합니다.

 

다음 예제는 int 타입의 List 객체에서 System.Linq의 Reverse() 메서드를 호출합니다.

class Program
{
  static void Main(string[] args)
  {
    List<int> intList = new List<int>()
    {
      5, 10, 15, 20, 25, 30 
    };

    // 1. 질의 구문(Query Syntax) 
    List<int> linqQueryResult = (from   num in intList
                                 select num).Reverse().ToList();

    // 2. 메서드 구문(Method Syntax)
    List<int> linqMethodResult = intList.Reverse<int>().ToList();

    Console.WriteLine("질의 구문");
    foreach (int num in linqQueryResult)
      Console.Write(num + " ");

    Console.WriteLine("\n메서드 구문");
    foreach (int num in linqMethodResult)
      Console.Write(num + " ");

    Console.WriteLine("\n데이터 원본");
    foreach (int num in intList)
      Console.Write(num + " ");
  }
}

[실행 결과]

질의 구문
30 25 20 15 10 5
메서드 구문
30 25 20 15 10 5
데이터 원본
5 10 15 20 25 30

데이터 원본은 변경되지 않고 반전된 데이터를 출력합니다.


예제 2. System.Collections.Generic의 Reverse 메서드

다음 예제는 System.Collections.Generic의 Reverse() 메서드를 호출합니다.

class Program
{
  static void Main(string[] args)
  {
    List<int> intList = new List<int>()
    {
      5, 10, 15, 20, 25, 30 
    };

    intList.Reverse();

    Console.WriteLine("데이터 원본");
    foreach (int num in intList)
      Console.Write(num + " ");
  }
}

[실행 결과]

데이터 원본
30 25 20 15 10 5

System.Linq의 Reverse() 메서드와 달리 데이터 원본을 변경합니다.


예제 3. List에 System.Linq의 Reverse 메서드 적용

List<T> 타입의 컬렉션에서 System.Linq의 Reverse() 메서드를 호출하는 방법은 위에서 설명했듯이 제네릭 타입을 명시하거나 AsEnumerable() 메서드를 사용하여 List<T> 컬렉션을 IEnumerable 타입으로 변환하거나 AsQueryable() 메서드를 사용하여 IQueryable 타입으로 변환해야 합니다.

 

다음 예제는 int 타입의 List 객체를 IEnumerable 그리고 IQueryable 타입으로 변환 후 Reverse() 메서드를 호출합니다.

class Program
{
  static void Main(string[] args)
  {
    List<int> intList = new List<int>()
    {
      5, 10, 15, 20, 25, 30 
    };

    // 1. AsQueryable() 메서드 호출
    List<int> linqReverseResult1 = intList.AsQueryable().Reverse().ToList();

    // 2. AsEnumerable() 메서드 호출
    List<int> linqReverseResult2 = intList.AsEnumerable().Reverse().ToList();

    Console.WriteLine("AsQueryable() 메서드 호출");
    foreach (int num in linqReverseResult1)
      Console.Write(num + " ");

    Console.WriteLine("\nAsEnumerable() 메서드 호출");
    foreach (int num in linqReverseResult2)
      Console.Write(num + " ");
  }
}

[실행 결과]

AsQueryable() 메서드 호출
30 25 20 15 10 5
AsEnumerable() 메서드 호출
30 25 20 15 10 5
반응형

댓글