LINQ

프로그래밍 공부/C# 2019. 1. 11. 20:18

LINQ는 Language Integrated Query의 줄임말로

객체, 데이터, XML과 같은 다양한 데이터를 표준화된 방법으로 처리하기 위해 만들어짐


LINQ는 다른 컬렉션이라도 IEnumerable<T>를 구현하고 있으면 같은 메서드를 사용 가능.

IEnumerable<T>를 구현하지 않으면 사용할 수 없다.


이렇게 쿼리 연산자가 조작하는 데이터를 시퀀스라고 한다.

가장 흔한 것이 배열과 리스트.




간단한 예제

1
2
3
4
int[] numbers = new int[7] { 0123456 };
 
var Query = numbers.Where(n => n % 2 == 0)
    .Select(n => n.ToString());
cs


1
2
3
4
5
6
int[] numbers = new int[7] { 0123456 };
 
var numQuery =
    from num in numbers
    where (num % 2== 0
    select num;
cs


LINQ는 위처럼 메서드구문과 쿼리구문(SQL과 비슷)을 이용할 수 있다.

메서드구문은 Where만 써도 상관없지만 쿼리구문은 select가 필수적이다.


Where은 조건을 만족하는 것만 추출하는 메서드고

Select는 각 요소에 대해서 해당하는 변환처리를 한다.


리턴형은 IEnumerable<T>로 위의 예제는 string을 리턴하므로 IEnumerable<string>이 될 것이고

아래는 int를 리턴하므로 IEnumerable<int>가 될 것이다.




쿼리 연산자는 where, select 외에도 여러가지가 존재하며 즉시실행 되는것과 지연실행 되는것이 있다.


즉시 실행은 말 그대로 즉시 결과가 실행되는 것으로

count처럼 하나의 값을 리턴하는 메서드는 모두 즉시 실행이다.


지연 실행은 메서드가 호출되도 해당 시점에서 검색이 실행되지않고 실제로 데이터가 필요할 때 쿼리가 실행된다.


1
2
3
4
5
6
7
8
9
static void Main(string[] args)
{
    int[] numbers = new int[7] { 0123456 };
    var Query = numbers.Where(n => n % 2 == 0);
    Print(Query);
    numbers[0= 11;
    Console.WriteLine();
    Print(Query);
}
cs


Print함수는 IEnumerable<Int>를 받게 직접 구현하였다.

이렇게 실행하면 첫번째 Print에서는 짝수인 0 2 4 6이 출력될 것이고


number는 수정하였으나 Query를 수정하지않았으니 2번째 Print에서도 그대로 출력될 것이라고 생각하지만

실제로는 2번째 Print에서 다시 쿼리가 실행되어 해당하는 2 4 6만 출력된다.



11이 아니라 10으로 변경하면 10 2 4 6이 출력될 것이다.



그렇기에 첫 실행의 결과물을 그대로 저장하고 싶다면 쿼리를 저장하는 것이 아니라

.ToArray() 또는 .ToList()를 통해 배열이나 리스트로 변환하여 저장하여야 결과물이 그대로 저장된다.

'프로그래밍 공부 > C#' 카테고리의 다른 글

문자열 처리  (0) 2019.01.15
기본 관용구  (0) 2019.01.11
델리게이트와 람다식  (0) 2019.01.11
인터페이스에 대해 프로그래밍하기  (0) 2019.01.11
Effective C#/ 제네릭 활용 - 아이템 18~23  (0) 2018.12.08
Posted by misty_
,