본문 바로가기

자작 프로그램

간단한 C# LINQ 식 예제

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


C#에는 LINQ라는 기능이 제공되죠.
이게 간단히 말하면 SQL 구문을 약간 변형시킨 것인데요
배열 또는 데이터베이스에서 조건에 맞는 자료만 뽑는 기능을 언어 자체에서 제공하는 것입니다.
스크립트에서나 볼 수 있는 기능들이 C#에 들어간 것을 보면 확실히 C#은 대단한 물건임에는 틀림 없습니다. ㄷㄷ

LINQ 식은 다음과 같은 포맷으로 구성됩니다.

IEnumerable<T> (인스턴스명) =
 
from (자동변수) in (배열 또는 DB) where (조건) select (리턴 값)

SQL과 비슷하면서도 약간의 차이가 있습니다. 바로 식의 순서인데요...
SQL에서는 이렇게 표현하겠죠. select (필드명) from (테이블명) where (조건)
그러나 컴파일러 특성상 변수 이름을 먼저 선언해야 하기에 부득이하게 어순을 조정했다고 합니다.
 
어쨌거나... 이런 데이터 배열이 있다고 가정합니다.

var pool = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100}

여기서 50이상의 수만을 추출하고 싶다면 이런 식이 가능하겠죠.

IEnumerable<int> result = from temp in pool where temp >= 50 select temp;


이 경우 result에는 {50, 60, 70, 80, 90, 100}; 이 저장됩니다.

상황을 조금 바꿔서 50이상의 수를 추출하되, 10으로 나눈 값들을 원한다면 이렇게 하시면 됩니다.

IEnumerable<int> result = from temp in pool where temp >= 50 select (temp / 10);

<예제>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CsTest
{
    class Program
    {
        static void Main(params string[] args)
        {
            List<int> integerList = new List<int>();
            int input = 0;

            do
            {
                Console.Write("양수 값을 입력 하세요. 입력을 중단하려면 -1을 입력하세요. >> ");
                input = int.Parse(Console.ReadLine());
                if (input >= 0) integerList.Add(input);
            } while (input != -1);

            var query1 = from idx in integerList where (idx >= 50) && (idx % 2 == 0) select -idx; // LINQ 이용
            var query2 = integerList.Where(idx => (idx >= 50) && (idx % 2 == 0)); // 람다식 이용

            int col = 1;
            Console.WriteLine("1 번째 쿼리");
            foreach (var q in query1)
            {
                Console.Write("{0}\t", q);
                if (col++ % 10 == 0) Console.Write("\n");
            }
            Console.WriteLine("\n");

            col = 1;
            Console.WriteLine("2 번째 쿼리");
            foreach (var q in query2)
            {
                Console.Write("{0}\t", q);
                if (col++ % 10 == 0) Console.Write("\n");
            }
            Console.WriteLine("\n");

            Console.WriteLine("END");
            Console.ReadLine();
        }
    }
}

<실행 결과>