본문 바로가기
프로그래밍/C# (WinForms)

C#, LINQ ] Enumerable 클래스, Range(), Select(), Where(), ToArray() 메서드

by eteo 2023. 4. 9.

 

 

LINQ

LINQ(Language Integrated Query)는 .NET Framework에서 데이터 쿼리를 지원하기 위해 도입된 기술로, C# 및 VB.NET에서 사용할 수 있는 쿼리 언어이다.

 

SQL과 유사한 쿼리 구문을 사용하여 데이터를 검색, 정렬, 필터링, 그룹화 및 조작할 수 있으며, System.Linq 네임스페이스에 속하는 다양한 클래스와 메서드를 제공한다. 이 네임스페이스에는 Enumerable, Queryable, Grouping, Lookup, OrderedEnumerable 등의 클래스가 포함되어 있고, Enumerable 클래스는 LINQ to Objects를 위한 확장 메서드를 제공하며, Queryable 클래스는 LINQ to SQL, LINQ to Entities, LINQ to XML 등 다양한 데이터 소스를 지원한다.

 

 

 

 

IEnumerable 인터페이스

IEnumerable 인터페이스는 컬렉션, 배열, 리스트 등과 같은 시퀀스 데이터를 나타내는 인터페이스로, 이 인터페이스를 상속받은 인터페이스와 클래스들은 시퀀스의 요소들을 열거할 수 있는 기능을 제공한다. 그리고 IEnumerable<T>은 IEnumerable을 상속받는 제네릭 인터페이스이다.

 

 

 

 

Enumerable 클래스

Enumerable 클래스는 LINQ의 일부로 IEnumerable 인터페이스를 구현하는 컬렉션 클래스에 대한 LINQ 기능을 제공한다. 즉, Enumerable 클래스는 IEnumerable<T> 인터페이스를 구현하는 컬렉션 객체에 대해 LINQ 쿼리를 수행할 수 있는 메서드를 제공한다.

 

클래스 안에는 여러 종류의 데이터 처리 작업을 수행할 수 있도록 해주는 LINQ Query 문법들,  Where(), Select(), OrderBy(), GroupBy(), Sum(), Average() 같은 메서드들을 제공한다.

 

아래와 같이 System.Linq 네임스페이스를 추가해 사용한다.

using System.Linq;

 

 

 

 

 

 

시퀀스

시퀀스는 순서가 있는 일련의 데이터를 나타내는 추상적인 개념이며, 시퀀스의 일종인 구체적인 데이터 구조로는 List, Array, IQueryable 등이 있다.

 

 

 

 

 

Range()

Enumerable 클래스의 정적 메서드로 일정한 숫자 범위의 시퀀스를 만들기 위해 사용된다.

두 개의 정수 매개변수를 받으며, 첫 번째 매개변수는 생성하려는 숫자 시퀀스의 시작점이고, 두 번째 매개변수는 생성하려는 숫자 시퀀스의 길이를 뜻한다.

 

예를 들어, Enumerable.Range(0, 5)는 0부터 시작하여 길이가 5인 시퀀스인 {0, 1, 2, 3, 4}를 만든다. 이렇게 생성된 시퀀스는 LINQ 쿼리에서 유용하게 활용될 수 있다.

 

Range() 사용예시

var sequence = Enumerable.Range(0, 5);

foreach (var number in sequence) {
    Console.WriteLine(number);
}

 

 

 

 

 

 

Where()

Where() 메소드는 특정 조건을 만족하는 요소만을 선택하여 새로운 시퀀스를 만든다.

 

예를 들어, 여러 숫자의 배열이 있다면, Where() 메소드를 사용하여 10 이상의 숫자만 선택하여 새로운 배열을 만들 수 있다. 

 

Where() 사용예시

int[] numbers = { 1, 3, 5, 7, 9, 11 };
var result = numbers.Where(num => num < 5);

 

 

 

 

 

 

Select() 

Select() 메소드는 람다 표현식을 인자로 받아서, 시퀀스의 각 요소를 람다 매개변수로 사용해 지정된 변환 함수를 적용하여 새로운 시퀀스를 반환한다.

여기서 변환 함수는 입력 요소를 출력 요소로 변환하는 함수이며, Select() 메소드는 이 함수를 시퀀스의 모든 요소에 대해 적용하게 된다. 반환된 시퀀스는 입력 시퀀스와 동일한 수의 요소를 가지며, 각 요소는 입력 요소를 변환한 결과이다.

 

Select() 사용예시

Select(x => x * 2)

 

 

 

 

 

ToArray() 

ToArray() 메서드는 IEnumerable<T> 인터페이스에 정의되어 있고, 이 인터페이스는 System.Collections 네임스페이스에 속해 있으며, LINQ를 사용하여 생성된 IEnumerable<T> 시퀀스에서 T[] 배열을 생성하기 위해 자주 사용된다.

 

LINQ 메서드 중 Where(), Select(), OrderBy(), GroupBy() 등은 IEnumerable<T>를 반환하므로, 먼저 시퀀스를 생성한 후 이들 메서드를 사용해 시퀀스를 조작하거나 변환한 뒤, 마지막으로 ToArray()를 사용해 배열로 변환할 수 있다.

 

 

ToArray() 사용예시

var numbers = Enumerable.Range(0, 10).ToList();
int[] array = numbers.ToArray();

 

 

 

 

 

Select(), ToArray() 사용예시

string[] words = { "apple", "banana", "cherry", "date", "elderberry", "fig", "grape" };
int[] wordLengths = words.Select(w => w.Length).ToArray();
// 결과
[5, 6, 6, 4, 10, 3, 5]