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
'C# > LINQ' 카테고리의 다른 글
[C#]LINQ 즉시 실행과 지연 실행(Immediate Execution vs Deferred Execution) (0) | 2022.08.15 |
---|---|
[C#]LINQ 결과를 Dictionary로 변환 - ToDictionary 메서드 (0) | 2022.08.15 |
[C#]LINQ 데이터 추가 방법 - Append, Prepend 메서드 (0) | 2022.08.14 |
[C#]LINQ 빈 값으로 설정 - Empty 메서드 (0) | 2022.08.14 |
[C#]LINQ 지정된 범위 또는 횟수만큼 데이터 생성 - Range, Repeat 메서드 (0) | 2022.08.14 |
댓글