본문 바로가기

C#/LINQ

LINQ to Objects의 기초

LINQ

  • Language Integrated Query
  • 람다식과 마찬가지로 C# 3.0부터 도입된 기능
  • LINQ를 사용하면 객체, 데이터, XML과 같은 다양한 데이터를 표준화된 방법으로 처리할 수 있다.
  • LINQ to Objects, 여러 객체를 입력데이터로 취급

 

LINQ to Objects의 간단한 예

LINQ를 사용하려면 먼저 using 지시자를 사용해 System.Linq 네임스페이스를 지정해야한다.

 

IEnumerable<string> results = names.Where(s=>s.Length <= 6);

 

Where 메서드는 시퀀스에서 조건을 만족하는 것만 추출하는 메서드이다.

 

List<T>의 FindAll 메서드처럼 인수로 람다식을 지정할 수 있고 동작도 비슷하지만

var names = list.FindAll(s=>s.Length <= 6);

FindAll은 List<T>를 통해서만 이용할 수 있다.

 

배열인 경우에도 FindAll 메서드를 사용할 수 있지만 다음과 같은 방식으로 작성해야한다.

Array.FindAll(arrayOfName, s=>s.Length <= 6);

 

List<T>나 배열 등 각각의 자료형에 따라 비슷한 기능을 하는 메서드가 각자 존재하고 사용방법이 다른 것을 확인할 수 있다.

 

하지만 LINQ의  Where 메서드 경우

배열, List<T>, Dictionary<TKey, Tvalue> 그 밖의 객체에도 IEnumerable<T> 인터페이스를 구현하고 있는 형이기만 하면 해당 객체를 대상으로 동일한 메서드를 이용할 수 있다는 점이 크게 다르다.

 

위와같이 '조건을 만족하는 요소를 찾는' 프로세스를 수행할 때 컬렉션의 종류에 따라 다른 방식으로 코드를 작성해야 한다는 것은 프로그래머에게 부담이된다.

 

LINQ를 사용하면 서로 다른 형의 컬렉션이어도 IEnumerable<T> 인터페이스를 구현한다면 같은 메서드를 이용할 수 있다.

 

Where 메서드의 반환값이 IEnumerable<T>이기 때문에 아래와 같이 메서드를 연결하여 실행할 수 있다.

 

//Where 메서드의 반환값이 IEumerable<T>라 LINQ Select 메서드를 바로 실행할 수 있다.

IEnumerable<string> results = names.Where(s=>s.Length <= 6).Select(s=>s.ToLower());

 

이처럼 메서드를 연결한는 것을 메서드 체인이라고 한다.

 

Select 메서드는 각 요소에 대해 람다식에서 지정한 변환 처리를 수행한다.

Select 메서드이 반환값 또한 IEnumerable<T>인데 이 요소에 형인 TSelect 메서드에서 지정하는 람다식에 의해 결정된다.

 

위 메서드 체인을 통해 실행한 Select의 람다식은 s=>s.ToLower()이므로

ToLower 메서드의 반환값의 형인 string이라

반환값이 IEnumerable<string>이 된다.

 

실제 코드에서는 일반적으로 var 키워드를 사용하여 아래와 같이 작성한다.

var results = names.Where(s=>s.Length <= 6).Select(s=>s.ToLower());

 

 

'C# > LINQ' 카테고리의 다른 글

LINQ의 지연 실행과 즉시 실행  (0) 2021.06.17