C#/LINQ

[C#]LINQ 결과를 리스트 또는 배열로 반환 - ToList, ToArray 메서드

DevStory 2022. 8. 14.

LINQ 결과를 리스트 또는 배열로 반환

C#의 Linq에서 제공하는 메서드는 IEnumerable<TResult>를 반환합니다.

 

따라서, 다음 예제처럼 LINQ의 결과를 리스트 또는 배열로 반환하는 경우 컴파일 에러가 발생합니다.

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

    List<int> whereResult = intList.Where(num => num > 1);

    Console.WriteLine("whereResult 값");
    whereResult.ForEach(num => Console.Write(num + " "));
  }
}

[에러 내용]

이번 포스팅에서 소개하는 다음 두 가지 메서드를 사용하면 LINQ 결과를 리스트 또는 배열로 반환할 수 있습니다.

- ToList(): Linq 결과를 List로 변환합니다.

- ToArray(): Linq 결과를 배열로 변환합니다.


ToList 메서드

C#의 Linq에서 제공하는 ToList() 메서드는 IEnumerable<T>를 List<T>로 변환합니다.

public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source);

ToList() 메서드는 IEnumerable 인터페이스의 확장 메서드이며, List<TSource>를 반환합니다.


예제 1. int 타입의 List로 반환

다음 예제는 int 타입의 List에서 1보다 큰 값을 Where() 메서드로 필터링합니다.

 

Where() 메서드 뒤에 ToList() 메서드를 호출하여 IEnumerable<TResult>를 List<T>로 변환합니다.

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

    List<int> linqToList = intList.Where(num => num > 1).ToList();

    Console.WriteLine("linqToList 결과");
    linqToList.ForEach(num => Console.Write(num + " "));
  }
}

[실행 결과]

linqToList 결과
2 3

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

다음 에제는 사용자 정의 클래스인 Person 타입의 List에서 Age 프로퍼티가 25보다 큰 요소를 Where() 메서드로 필터링 후 Person 타입의 List로 반환합니다.

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

class Program
{
  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<Person> linqToList = personList.Where(num => num.Age > 25).ToList();

    linqToList.ForEach(item => Console.WriteLine("Name: " + item.Name + ", Age: " + item.Age));
  }
}

[실행 결과]

Name: 마이콜, Age: 30
Name: 고길동, Age: 40

예제 3. 사용자 정의 클래스 타입에서 값 변경

다음 예제는 사용자 정의 클래스인 Person 타입의 List에서 Age 프로퍼티가 25보다 큰 요소를 Where() 메서드로 필터링 후 Age 프로퍼티에 10을 곱한 결과를 Person 타입의 List로 반환합니다.

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

class Program
{
  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<Person> linqToList = personList
        .Where(num => num.Age > 25)
        .Select(item => new Person { Name=item.Name, Age=item.Age * 10})
        .ToList();

    linqToList.ForEach(item => Console.WriteLine("Name: " + item.Name + ", Age: " + item.Age));
  }
}

[실행 결과]

Name: 마이콜, Age: 300
Name: 고길동, Age: 400

ToArray 메서드

IEnumerable<T>를 배열로 변환해야 하는 경우 ToArray() 메서드를 사용합니다.

public static TSource[] ToArray<TSource>(this IEnumerable<TSource> source);

ToArray() 메서드는 IEnumerable 인터페이스의 확장 메서드이며, TSource[] 를 반환합니다.


예제 1. int 타입의 배열로 반환

다음 예제는 int 타입의 List에서 1보다 큰 값을 Where() 메서드로 필터링합니다.

 

Where() 메서드 뒤에 ToArray() 메서드를 호출하여 IEnumerable<TResult>를 int 타입의 배열로 변환합니다.

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

    int[] linqToArray = intList.Where(num => num > 1).ToArray();

    Console.WriteLine("linqToArray 결과");
    foreach (int num in linqToArray) 
    {
        Console.Write(num + " ");
    }
  }
}

[실행 결과]

linqToArray 결과
2 3

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

다음 예제는 사용자 정의 클래스인 Person 타입의 List에서 Age 프로퍼티가 25보다 큰 요소를 Where() 메서드로 필터링 후 Age 프로퍼티에 10을 곱한 결과를 Person 타입의 배열로 반환합니다.

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

class Program
{
  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}
    };

    Person[] linqToArray = personList
        .Where(num => num.Age > 25)
        .Select(item => new Person { Name = item.Name, Age = item.Age * 10 })
        .ToArray();

    foreach (Person item in linqToArray)
    {
      Console.WriteLine("Name: " + item.Name + ", Age: " + item.Age);
    }
  }
}

[실행 결과]

Name: 마이콜, Age: 300
Name: 고길동, Age: 400
반응형

댓글