LINQ는 Language Integrated Query의 줄임말로
객체, 데이터, XML과 같은 다양한 데이터를 표준화된 방법으로 처리하기 위해 만들어짐
LINQ는 다른 컬렉션이라도 IEnumerable<T>를 구현하고 있으면 같은 메서드를 사용 가능.
즉 IEnumerable<T>를 구현하지 않으면 사용할 수 없다.
이렇게 쿼리 연산자가 조작하는 데이터를 시퀀스라고 한다.
가장 흔한 것이 배열과 리스트.
간단한 예제
1 2 3 4 | int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 }; var Query = numbers.Where(n => n % 2 == 0) .Select(n => n.ToString()); | cs |
1 2 3 4 5 6 | int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 }; 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] { 0, 1, 2, 3, 4, 5, 6 }; 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 |