C#

[C#]List의 타입을 변경하는 방법

DevStory 2022. 8. 28.

List의 타입을 변경하는 방법

이번 포스팅은 C#에서 List의 타입을 변경할 수 있는 몇 가지 방법을 소개합니다.


방법 1. List 클래스의 ConvertAll 메서드

첫 번째 방법으로 List 클래스에서 제공하는 ConvertAll() 메서드를 사용할 수 있습니다.

public List<TOutput> ConvertAll<TOutput>(Converter<T, TOutput> converter);

Convert<T, TOutput> converter

- 배열의 요소를 특정 타입으로 변환하는 변환기를 전달합니다.

- T: 기존 배열의 타입을 설정합니다.

- TOutput: 변환하고 싶은 타입을 설정합니다.

 

ConvertAll() 메서드는 특정 타입으로 변환된 새로운 배열을 반환합니다.


예제 1. int 타입의 List를 string 타입으로 변경

다음 예제는 int 타입의 List를 string 타입으로 변환된 새로운 List를 반환합니다.

 

[변환 방법]

순서 1. int 타입의 매개변수를 가지며, string 타입을 반환하는 메서드 구현

순서 2. int 타입의 List에서 ConvertAll() 메서드를 호출

순서 3. ConvertAll() 메서드의 매개변수로 Converter 생성자 함수를 전달

순서 4. Convert 생성자 함수에 순서 1. 에서 구현된 메서드를 매개변수로 전달

class Program
{
  public static string intToString(int num)
  {
    return num.ToString();
  }

  static void Main(string[] args)
  {
    List<int> intList = new List<int>() { 1, 2, 3, 4, 5, 6, 7 };

    List<string> strList = intList.ConvertAll(new Converter<int, string>(intToString));

    Console.WriteLine("[strList의 요소]");
    Console.WriteLine(string.Join(", ", strList));
  }
}

[실행 결과]

[strList의 요소]
1, 2, 3, 4, 5, 6, 7

 

다음 예제는 int 타입의 List를 string 타입으로 변환하며, 각 요소에 문자열 "번"을 추가합니다.

class Program
{
  public static string intToString(int num)
  {
    return num.ToString() + "번";
  }

  static void Main(string[] args)
  {
    List<int> intList = new List<int>() { 1, 2, 3, 4, 5, 6, 7 };

    List<string> strList = intList.ConvertAll(new Converter<int, string>(intToString));

    Console.WriteLine("[strList의 요소]");
    Console.WriteLine(string.Join(", ", strList));
  }
}

[실행 결과]

[strList의 요소]
1번, 2번, 3번, 4번, 5번, 6번, 7번

예제 2. ConvertAll 메서드에 람다 표현식 전달

ConvertAll() 메서드의 매개변수인 Convert() 메서드는 대리자(Delegate)입니다.

 

따라서, 생성자 함수 대신 람다 표현식을 전달할 수 있습니다.

 

다음 예제는 타입을 변환하는 메서드를 구현하지 않고 람다 표현식을 사용하여 간단하게 구현합니다.

class Program
{
  static void Main(string[] args)
  {
    List<int> intList = new List<int>() { 1, 2, 3, 4, 5, 6, 7 };

    List<string> strList = intList.ConvertAll(num => num.ToString() + "번");

    Console.WriteLine("[strList의 요소]");
    Console.WriteLine(string.Join(", ", strList));
  }
}

[실행 결과]

[strList의 요소]
1번, 2번, 3번, 4번, 5번, 6번, 7번

예제 3. 사용자 정의 클래스

List의 타입이 int, bool 타입처럼 기본 타입이 아닌 참조 타입인 경우 값을 변환하는 과정이 까다로울 수 있습니다.

 

다음 예제는 사용자가 정의한 클래스 타입인 Person 타입의 List를 User 타입의 List로 변환합니다. Age 프로퍼티는 2를 곱한 값이 문자열로 변환됩니다.

public class Person
{
  public string Name { get; set; }
  public int Age { get; set; }
}

public class User
{
  public string Name { get; set; }
  public string Age { get; set; }
}

class Program
{
  public static User PersonToUser(Person person)
  {
    return new User() { Name = person.Name, Age = (person.Age * 2).ToString() };
  }

  static void Main(string[] args)
  {
    List<Person> personList = new List<Person>()
    {
      new Person { Name = "둘리", Age = 20 },
      new Person { Name = "또치", Age = 30 },
      new Person { Name = "생선", Age = 40 }
    };

    List<User> userList = personList.ConvertAll(new Converter<Person, User>(PersonToUser));
    // 람다 표현식을 사용하는 경우
    /*
    List<User> userList = personList.ConvertAll(person => { 
      return new User() { Name = person.Name, Age = (person.Age * 2).ToString() };
    });
    */
    
    Console.WriteLine("personList의 요소");
    foreach (Person person in personList)
    {
      Console.WriteLine("Name: " + person.Name + ", Age: " + person.Age);
    }

    Console.WriteLine("\nuserList의 요소");
    foreach (User user in userList)
    {
      Console.WriteLine("Name: " + user.Name + ", Age: " + user.Age);
    }
  }
}

[실행 결과]

personList의 요소
Name: 둘리, Age: 20
Name: 또치, Age: 30
Name: 생선, Age: 40

userList의 요소
Name: 둘리, Age: 40
Name: 또치, Age: 60
Name: 생선, Age: 80

방법 2. LINQ의 Select 메서드 사용

두 번째 방법으로 LINQ의 Select() 메서드를 사용하여 List의 타입을 변환할 수 있습니다.

 

먼저, LINQ의 Select() 메서드를 사용하기 위해 다음 네임스페이스를 추가합니다.

using System.Linq;

Select() 메서드는 IEnumerable<TResult>를 반환하므로 ToList() 메서드를 호출하여 Select() 메서드 반환 결과를 List로 변환합니다.

public static IEnumerable<TResult> Select<TSource, TResult>(
  this IEnumerable<TSource> source, 
  Func<TSource, TResult> selector);

예제 1. int 타입의 List를 string 타입으로 변경

다음 예제는 int 타입의 List를 string 타입의 List로 변환된 새로운 List를 반환합니다.

class Program
{
  static void Main(string[] args)
  {
    List<int> intList = new List<int>() { 1, 2, 3, 4, 5, 6, 7 };

    List<string> strList = intList.Select(num => num.ToString() + "번").ToList();

    Console.WriteLine("[strList의 요소]");
    Console.WriteLine(string.Join(", ", strList));
  }
}

[실행 결과]

[strList의 요소]
1번, 2번, 3번, 4번, 5번, 6번, 7번

예제 2. 사용자 정의 클래스

List의 타입이 사용자가 정의한 클래스 타입인 경우 값을 변환하는 메서드 또는 람다 표현식을 Select() 메서드에 전달합니다.

 

다음 예제는 Person 타입을 User 타입으로 변환하는 PersonToUser() 메서드를 Select() 메서드에 전달하여 타입을 변환합니다.

public class Person
{
  public string Name { get; set; }
  public int Age { get; set; }
}

public class User
{
  public string Name { get; set; }
  public string Age { get; set; }
}

class Program
{
  public static User PersonToUser(Person person)
  {
    return new User() { Name = person.Name, Age = (person.Age * 2).ToString() };
  }
  
  static void Main(string[] args)
  {
    List<Person> personList = new List<Person>()
    {
      new Person { Name = "둘리", Age = 20 },
      new Person { Name = "또치", Age = 30 },
      new Person { Name = "생선", Age = 40 }
    };

    List<User> userList = personList.Select(person => PersonToUser(person)).ToList();
    Console.WriteLine("personList의 요소");
    foreach (Person person in personList)
    {
      Console.WriteLine("Name: " + person.Name + ", Age: " + person.Age);
    }

    Console.WriteLine("\nuserList의 요소");
    foreach (User user in userList)
    {
      Console.WriteLine("Name: " + user.Name + ", Age: " + user.Age);
    }
  }
}

[실행 결과]

personList의 요소
Name: 둘리, Age: 20
Name: 또치, Age: 30
Name: 생선, Age: 40

userList의 요소
Name: 둘리, Age: 40
Name: 또치, Age: 60
Name: 생선, Age: 80
반응형

댓글