C# Linq
LINQ는 Language Integrated Query의 약자로 통합질의언어라고 말한다.
이름에서 보면 무언가 통합된 언어라는 의미인데, SQL의 Select구문과 유사한 구문을 이용하여
컬렉션 형태의 데이터에 대해 질의를 통한 데이터처리가 가능하다.
LINQ는 MS-SQL의 데이터나 메모리에 있는 컬렉션 객체, XML에서 사용된다.
다음과 같이 학생 객체가 있다.
1 2 3 4 5 6 7 8 | List<StudentInfo> studentList = new List<StudentInfo> { new StudentInfo { Name = "Space" , Age = 21, Grade = "A" } , new StudentInfo { Name = "ESC" , Age = 22, Grade = "A+" } , new StudentInfo { Name = "Enter" , Age = 23, Grade = "B+" } , new StudentInfo { Name = "Tab" , Age = 30, Grade = "A-" } , new StudentInfo { Name = "Shift" , Age = 25, Grade = "A+" } }; |
예를 들어 학생 리스트 중에서 A학점인 학생을 나이 순으로 정렬하고 싶다고 하자.
LINQ를 사용하지 않는 일반 코드를 이용하면 다음과 같이 표현할 수 있을 것이다.
1 2 3 4 5 6 7 8 9 | List<StudentInfo> searchList = new List<StudentInfo>(); searchList = studentList.FindAll(sl => sl.Grade.Contains( "A" )); searchList.Sort((sl1, sl2) => sl1.Age - sl2.Age ); foreach (StudentInfo student in searchList) { Console.WriteLine( "Name : " + student.Name + ", Age : " + student.Age + ", Grade : " + student.Grade); } |
List객체에서 사용가능한 함수와 람다식을 이용하여 최대한 간단하게 작성해 보았다.
그럼 LINQ를 이용한 코드를 한번 보자
1 2 3 4 5 6 7 8 9 | var searchList = from sl in studentList where sl.Grade.Contains( "A" ) orderby sl.Age select sl; foreach (StudentInfo student in searchList) { Console.WriteLine( "Name : " + student.Name + ", Age : " + student.Age + ", Grade : " + student.Grade); } |
람다식을 이용한 코드도 굉장히 간단하다고 생각했는데
LINQ를 이용하면 좀 더 간단한 표현이 가능하다.
그럼 위에서 작성한 LINQ구문을 다시 잘 살펴보자
FROM, WHERE, ORDER등이 쓰이는 것을 보니 SQL과 유사하다는 것을 알 수 있다.
SQL과 비슷하여 이해되겠지만 하나씩 보도록 하자.
우선 from은 범위를 지정해 주는 부분이다.
foreach에서도 괄호 안에 범위를 지정하듯이 from뒤에 범위를 지정하면 된다.
1 | from sl in studentList |
1 2 3 | var searchList = from sl in studentList where sl.Grade.Contains( "A" ) |
order는 정렬을 정의하는 부분이다.
order + 정렬될 객체 뒤에 아무것도 없으면 오름차순으로 정렬되고, 반대로 내림차순으로 정렬하고 싶다면 desending을 추가한다.
1 2 3 | var searchList = from sl in studentList where sl.Grade.Contains( "A" ) orderby sl.Age |
마지막으로 select에서는 추출할 데이터를 정의하면 된다.
1 2 3 4 | var searchList = from sl in studentList where sl.Grade.Contains( "A" ) orderby sl.Age select sl; |
전체 객체 추출도 가능하고 다음과 같이 필요한 데이터만 추출하는 것도 가능하다.
1 2 3 4 | var searchList = from sl in studentList where sl.Grade.Contains( "A" ) orderby sl.Age select new { sl.Age, sl.Grade }; |
'프로그래밍 > C#' 카테고리의 다른 글
C# 람다식(Lamda Expression) (9) | 2015.04.11 |
---|---|
C# 대리자(Delegate) (288) | 2015.04.08 |
C# 가비지 컬렉션(Garbage Collection) (1274) | 2015.03.23 |
C# 기본자료형, 변수 (10) | 2015.03.22 |