1. LINQ 란?
LINQ(링크)는 Language Integrated Qurey의 약어로, 직역하면 '질의로 통합된 언어' 이다.
말이 참 난해하다.;; 그냥 쉽게 말해 '데이터에 대해 질문하는 언어' 라고 볼 수 있다.
C#에서는 데이터에 대해 질문하는 LINQ(링크)라는 기능을 제공한다.
LINQ의 역할은 데이터에 대해 질문하고, 그 답에 해당하는 데이터를 찾는 것이다.
이러한 LINQ의 질의 기능은 프로그램에서 데이터 검색을 겁나 편리하게 해준다.
예를 들어 결혼정보업체에서 한국의 모든 사람에 대한 데이터를 가지고 있는데
그 중에 여자이면서 20세 이상 성인들의 데이터를 어린 나이 순으로 찾는다고 치자.
그럼 데이터를 하나하나 검색하면서 이런 질문을 던질 수 있을것이다.
첫번째. 여자인가?
두번째. (검색된 여자 중에서) 20세가 넘는 성인인가?
세번째. (검색된 성인여자 중에서) 나이가 어린가?
이렇게 세 질문을 거치면 성인 여자를 어린 나이 순으로 찾을 수 있다.
위의 질문들을 LINQ 쿼리식으로 작성하면 다음과 같다.
var women =
from woman in womanList // womanList에서 (여자인가?)
where woman.age > 20 // 20세가 넘는 성인을 (성인인가?)
orderby woman.age // 나이 순으로 정렬하여 (나이가 어린가?)
select woman; // 배열 데이터로 추출한다.
만약 이를 LINQ없이 단순 코드로만 작성하면 다음과 같다.
List<Woman> women = new List<Woman>();
// 여자 리스트에서 20세 이상 성인 추출
foreach (Woman woman in womanList)
{
if (woman.age > 20)
Womwn.add(woman);
}
// 어린 나이순으로 정렬
Women.Sort( (w1, w2) => w1.age - w2.age; );
// 추출된 성인여자 데이터를 출력
foreach (var woman in Women)
Console.WriteLine("{0}, {1}", woman.name, woman.age);
상당히 많은 코드를 생략했는데도 이정도다.
LINQ를 쓰면 얼마나 코드가 단순해지는지 실감할 수 있을 것이다.
2. from
데이터를 검색하기 위해서는 우선적으로 데이터를 검색할 범위를 지정해 주어야 한다.
그 역할을 해주는 것이 from 절이다.
이제 from 에서 범위를 지정해주면 그 범위 내에서 데이터 검색이 시작되기 때문에
모든 LINQ 쿼리식(Query Expression)은 반드시 from 으로 시작해야 한다.
from 절의 작성 형식은 foreach 문과 거의 비슷하다.
Ex) foreach( var element in array ) == from element in array
※ foreach 문과 from 절의 element 변수의 차이점 foreach 의 element 변수에는 실제로 array 의 데이터가 저장된다. 하지만 LINQ 에서는 element 변수에 데이터가 저장되지 않고 단순히 'array에 존재하는 요소' 라는 의미로만 사용된다. |
Woman[] womanList = {
new Woman() { name="아라", age=24 },
new Woman() { name="도희", age=20 },
new Woman() { name="현아", age=22 } };
var women = from woman in womanList
where woman.age > 20
orderby woman.age
select woman;
from 에서 사용가능한 타입은 IEnumerable<T> 인터페이스를 상속하는 타입이다.
C#에서의 배열이나 컬렉션등은 모두 IEnumerable<T>을 상속하기 때문에
배열이나 컬렉션 타입이라면 전부 사용가능하다.
3. where
from으로 검색 범위를 지정하였다면 where은 범위 내에서 데이터를 걸러내는 필터 역할을 한다.
따라서 where 에서는 데이터를 걸러내기 위한 필터 조건을 작성해주면 된다.
Woman[] womanList = {
new Woman() { name="아라", age=24 },
new Woman() { name="도희", age=20 },
new Woman() { name="현아", age=22 } };
var women = from woman in womanList
where woman.age > 20
orderby woman.age
select woman;
그러면 해당 조건에 참이 되는 데이터만 걸러지게 된다.
4. orderby
orderby는 걸러진 데이터를 정렬해주는 연산자이다.
기본값으로 오름차순 정렬을 사용하기 때문에
정렬 키워드 없이 정렬 기준만 제시하면 그 기준에 따라 오름차순으로 정렬해준다.
Woman[] womanList = {
new Woman() { name="아라", age=24 },
new Woman() { name="도희", age=20 },
new Woman() { name="현아", age=22 } };
var women = from woman in womanList
where woman.age > 20
orderby woman.age // 오름차순 정렬
// orderby woman.age ascending 동일
// orderby woman.age descending (내림차순)
select woman;
가독성 위해 오름차순(ascending)과 내림차순(descending)을 명시해주는 것이 좋다고 본다.
5. select
최종적으로 검색되 데이터를 추출하는 역할을 한다.
추출된 데이터의 타입은 select절에 지정한 변수의 타입으로 결정되며
무명형식(타입)으로 만들어서 추출할 수도 있다.
select woman; // woman 형 배열 데이터 추출
select woman.name; // string형 name 배열데이터 추출
select new { // 무명 타입의 배열데이터 추출
title = "성인여자", name = woman.name };
지금까지의 내용을 간단히 프로그램으로 작성해 보자.
(주의 : 링크를 사용하기 위해서는 System.Linq 네임스페이스를 추가해주어야 한다.)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
using System.Linq;
class Wiman
{
public string name { get; set; }
public int age { get; set; }
}
class MainApp
{
static void Main(string[] args)
{
Woman[] womanList =
{
new Woman() { name = "아라", age = 24 },
new Woman() { name = "민희", age = 20 },
new Woman() { name = "현아", age = 32 },
new Woman() { name = "수지", age = 20 }
};
var Women = from woman in womanList
where woman.age> 20
orderby woman.age ascending
select new {
title = "성인 여자",
name = woman.name
};
foreach (var woman in Women)
Console.WriteLine("{0}: {1}", woman.title, woman.name);
}
}
|
'IT 야놀자 > C #' 카테고리의 다른 글
LINQ (링크) 2 - group by, join (0) | 2019.11.12 |
---|---|
Func & Action 델리게이트 (0) | 2019.11.10 |
람다식 (Lamda Expression) (0) | 2019.11.07 |
이벤트 (Event) (0) | 2019.11.06 |
무명 형식, 무명 메소드 (0) | 2019.11.05 |