C# 이것저것/초보자를 위한 C#200제

[C#] LINQ 기초

agingcurve 2024. 2. 2. 14:27
반응형

LINQ(Languate-INtegrated Query)는 C#에 통합된 데이터 질의 기능이다.

SQL과 같은 Query 언어는 데이터베이스 언어인데 이것을 C#에 도입한 것이다.

LINQ를 사용하면 컬렉션에서 데이터를 다루는 방법이 간단해진다.

 

var sortedEven = from item in data //불러올 데이터
	where item % 2 ==0 //조건
    orederby item // 정렬
    select item; // 선택

 

 

"data 컬렉션에 있는 데이터 item으로부터 item이 짝수이면 item 값이 정렬하여 선택한다"이며, LINQ를 사용하면 원본 데이터가 IEnumerable이나 IEnumerable <T> 인터페이스를 상속하는 형식이어야 한다.

 

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

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

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

            Console.WriteLine("Using foreach: ");
            foreach (var item in lsSortedEven)
            {
                Console.Write(item + " ");
            }
            Console.WriteLine();

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

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

        }
    }
}

 

Linq를 사용하려면 using System.Linq를 추가해야 하며, 정수의 리스트 data를 정의하고 초기화한다. 정렬된 짝수의 리스트 lstSortedEven을 정의한다.

 

 

조건 검색과 정렬

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

namespace A121_LinqBasic2
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> data = new List<int> { 123, 45, 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.Write(" " + i);
            }
            Console.WriteLine();
        }
    }
}

 

LINQ의 결과를 리스트나 배열로 반환

LINQ의 결과는 IEnumerable<T>가 되는데, LINQ의 결과를 리스트로 받고 싶으면 ToList<T>()메서드를 사용한다. 이와 비슷하게 LINQ의 결과를 배열로 받고 싶으면 ToArray<T>() 메서드를 사용하면 된다.

 

다음 프로그램은 리스트의 값 중에서 홀수를 찾아 정렬하여 리스트로 반환하고 짝수를 찾아 정렬하여 배열로 반환한다.

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

namespace A122_LinqToList
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> lstData = new List<int> { 123, 456, 132, 96, 13, 465, 321 };
            Print("Data : ", lstData);

            List<int> lstOdd = new List<int>();
            lstOdd = SelectOddAndSort(lstData);
            Print("Ordered Odd:", lstOdd);

            int[] arrEven;
            arrEven = SelectEvenAndSort(lstData);
            Print("Orederd Even", arrEven);
            
        }

        private static List<int> SelectOddAndSort(List<int> lstData)
        {
            return (from item in lstData
                    where item % 2 == 1
                    orderby item
                    select item).ToList<int>();
        }

        private static int[] SelectEvenAndSort(List<int> lstData)
        {
            return (from item in lstData
                    where item % 2 == 0
                    orderby item
                    select item).ToArray<int>();
        }

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

    }
}