본문으로 바로가기

[C#] LiNQ

category 개발자과정준비/C# 2020. 8. 29. 00:35
반응형

LINQ

 LINQ는 Language Integrated Query의 약자로 C#에 통합된 데이터 질의 기능이다. SQL과 같은 Query언어는 데이터베이스에서 사용되던 언어인데, 이를 C#에 도입한 것이다. LINQ를 사용하면 컬렉션에서 데이터를 다루는 방법이 훨씬 간단해진다. LINQ는 람다와 함께 C# 3.0에 도입된 기능이다.

var sorted Even = from item in data
          where item % 2 == 0
          orderby item
          select item;

위의 문장을 보면 from, where, orderby, select 등의 LINQ 연산자가 사용되었다.

"data 컬렉션에 있는 데이터 item으로 부터 item이 짝수이면 item값으로 정렬하여 선택한다." 라는 뜻의 쿼리문이다.

 

LINQ를 사용하려면 원본 데이터가 IEumerable 이나 IEumerable <T> 인터페이스를 상속하는 형식이어야한다. 배열과 리스트 등의 컬렉션들은 모두 여기에 해당된다.

 

List에서 짝수 데이터만 꺼내서 정렬하는 예제를 기존의 방법과 LINQ를 사용하는 두 가지 방법으로 작성해보자. 

using System;
using System.Collections.Generic;
using System.Linq;
namespace _20200821_005_LinQ
{
    class Program
    {
        static void Main(string[] args)
        {
            // 기존의 예제
            List<int> data = new List<int> { 123, 34, 12, 89, 456, 1, 4, 74, 46 };
            List<int> lstSortedEven = new List<int>();

            foreach (var item in data)
            {
                if (item % 2 == 0)
                    lstSortedEven.Add(item);
            }
            lstSortedEven.Sort();

            Console.WriteLine("Using foreach : ");
            foreach (var item in lstSortedEven)
                Console.Write(item + " ");
            Console.WriteLine();

            var sortedEven = from item in data   // LINQ 시작
                             where item % 2 == 0
                             orderby item
                             select item;

            Console.WriteLine("\nUsing Linq: ");
            foreach (var item in sortedEven)
                Console.Write(item + " ");
            Console.WriteLine();
        }
    }
}

foreach 문이나 LINQ가 똑같이 출력되는 것을 볼 수 있다

 

 

 

 

 

LINQ를 이용한 조건 검색과 정렬

LINQ 사용법을 조금 더 공부해보자. 컬렉션에서 원하는 값을 찾는 과정이 마치 DB에서 질의하는 것과 같다. 

이번엔 조건이 있는 예제를 작성해보자.

// data 리스트에서 20보다 큰 짝수를 내림차순으로 정렬하여 저장
// 이 값을 2씩 곱해서 오름차순으로 정렬하여 저장
using System;
using System.Collections.Generic;
using System.Linq;

namespace _20200821_005_LinQ_2
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> data = new List<int> { 123, 34, 12, 89, 456, 1, 4, 74, 46 };

            Print("data : ", data);

            var lstEven = from item in data
                          where (item > 20 && item % 2 == 0)
                          orderby item descending
                          select item;

            Print("20보다 큰 짝수 검색결과: ", lstEven);

            var lstSorted = from item in lstEven
                            orderby item ascending
                            select item * 2;

            Print("2를 곱해서 오름차순 정렬: ", lstSorted);
        }

        private static void Print(string s,IEnumerable<int> data)
        {
            Console.WriteLine(s);
            foreach (var i in data)
                Console.WriteLine(" " + i);
            Console.WriteLine();
        }
    }
}

실행 화면

 

select가 필요한 이유?

form temp in ㅁㅁㅁ    // 추출

select temp              // 가공

 

추출부분은 그대로 쓰겠다는 거고, 가공부분은 곱하기2나 다른 가공이 필요하면 select같은 가공부분이 필요하다.

 

from temp in aList1

order by Temp  (ascending <-> deascending)      // 아무것도 안적으면 오름차순이 생략되어있다.(반대는 내림차순)

select temp

반응형