LINQ λ©”μ„œλ“œ

LINQλŠ” C#μ—μ„œ μ»¬λ ‰μ…˜ 데이터λ₯Ό μ‰½κ²Œ μ§ˆμ˜ν•˜κ³  μ‘°μž‘ν•˜λŠ” κΈ°λŠ₯이닀. μ •λ ¬, 필터링, λ³€ν™˜ 등을 ν•  수 μžˆλ‹€.

LINQλŠ” μ§€μ—° μ‹€ν–‰κ³Ό μ¦‰μ‹œ μ‹€ν–‰ 두 κ°€μ§€ λ°©μ‹μœΌλ‘œ λ™μž‘ν•œλ‹€.

μ£Όμš” λ©”μ„œλ“œ

OrderBy - μ •λ ¬

var sortedList = arr.OrderBy(v => v);
  • μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬
  • λ°˜ν™˜: IEnumerable<T>
  • μ§€μ—° μ‹€ν–‰: 호좜 μ‹œμ μ—λŠ” μ‹€ν–‰ μ•ˆ 됨, foreachλ‚˜ ToList() ν•  λ•Œ μ‹€ν–‰

Where - 필터링

var evenNumbers = arr.Where(v => v % 2 == 0);
  • 쑰건에 λ§žλŠ” μš”μ†Œλ§Œ 필터링
  • v % 2 == 0 β†’ 짝수만
  • μ§€μ—° μ‹€ν–‰: μ‹€μ œ 연산은 데이터 μ—΄κ±°ν•  λ•Œ μˆ˜ν–‰

ToList - μ¦‰μ‹œ μ‹€ν–‰

var evenList = arr.Where(v => v % 2 == 0).ToList();
  • IEnumerable<T>λ₯Ό List<T>둜 λ³€ν™˜
  • μ¦‰μ‹œ μ‹€ν–‰: 호좜 μ‹œμ μ— λ°”λ‘œ μ‹€ν–‰λ˜μ–΄ λ©”λͺ¨λ¦¬μ— μ €μž₯
  • μž¬μ‚¬μš©ν•˜κ±°λ‚˜ ForEach 같은 λ©”μ„œλ“œ μ“Έ λ•Œ ν•„μš”

yield ν‚€μ›Œλ“œ

yield return을 μ“°λ©΄ 데이터λ₯Ό 순차적으둜 λ°˜ν™˜ν•  수 μžˆλ‹€. λ©”λͺ¨λ¦¬ 효율적!

IEnumerable<int> GetEvenNumbers(int[] arr)
{
    foreach (var v in arr)
    {
        if (v % 2 == 0)
        {
            yield return v; // 짝수만 λ°˜ν™˜
        }
    }
}

var evenNumbers = GetEvenNumbers(new int[] { 1, 2, 3, 4, 5 });
foreach (var num in evenNumbers)
{
    Console.WriteLine(num);
}

κ²°κ³Ό:

2
4

νŠΉμ§•:

  • μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ IEnumerableκ³Ό IEnumerator κ΅¬ν˜„
  • 데이터 μš”μ²­ν•  λ•Œλ§Œ 쑰건 검사 β†’ λ©”λͺ¨λ¦¬ 효율적
  • GetEnumerator λ©”μ„œλ“œ μžλ™ 생성

μ§€μ—° μ‹€ν–‰ vs μ¦‰μ‹œ μ‹€ν–‰

μ§€μ—° μ‹€ν–‰ (Deferred Execution)

  • OrderBy, Where λ“±
  • 데이터 μ—΄κ±°ν•  λ•Œ μ—°μ‚° μˆ˜ν–‰

μž₯점: λ©”λͺ¨λ¦¬ 효율적, λΆˆν•„μš”ν•œ μ—°μ‚° 피함
단점: μ—¬λŸ¬ 번 μ—΄κ±°ν•˜λ©΄ λ‹€μ‹œ 계산

var query = arr.Where(v => v % 2 == 0);
foreach (var item in query) // μ΄λ•Œ μ‹€μ œ 필터링 μˆ˜ν–‰
{
    Console.WriteLine(item);
}

μ¦‰μ‹œ μ‹€ν–‰ (Immediate Execution)

  • ToList(), ToArray() λ“±
  • 호좜 μ‹œμ μ— λ°”λ‘œ μ‹€ν–‰

μž₯점: ν•œ 번 κ³„μ‚°ν•˜κ³  λ©”λͺ¨λ¦¬μ— μ €μž₯, μž¬μ‚¬μš© μ‹œ 빠름
단점: λ©”λͺ¨λ¦¬ μ‚¬μš©

var result = arr.Where(v => v % 2 == 0).ToList(); // μ¦‰μ‹œ μ‹€ν–‰

IEnumerable vs List

ꡬ뢄 IEnumerable List
μ‹€ν–‰ 방식 μ§€μ—° μ‹€ν–‰ μ¦‰μ‹œ μ‹€ν–‰
데이터 μ €μž₯ μ €μž₯ μ—†μŒ (μ‹€μ‹œκ°„ μ—°μ‚°) λ©”λͺ¨λ¦¬μ— μ €μž₯
μž¬μ‚¬μš©μ„± 맀번 λ‹€μ‹œ 계산 μ €μž₯된 κ²°κ³Ό μž¬μ‚¬μš©
μ„±λŠ₯ λ©”λͺ¨λ¦¬ 효율적 μ ‘κ·Ό 속도 빠름

μ’…ν•© 예제

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

class Program
{
    static void Main()
    {
        int[] arr = { 5, 1, 4, 2, 3 };

        var sortedEvenNumbers = arr
            .OrderBy(v => v)        // μ •λ ¬
            .Where(v => v % 2 == 0) // 짝수 필터링
            .ToList();              // μ¦‰μ‹œ μ‹€ν–‰ 및 List λ³€ν™˜

        sortedEvenNumbers.ForEach(v => Console.WriteLine(v));
    }
}

κ²°κ³Ό:

2
4

정리

  • LINQλŠ” μ§€μ—° μ‹€ν–‰κ³Ό μ¦‰μ‹œ 싀행을 κ΅¬λΆ„ν•΄μ„œ 써야 함
  • μ§€μ—° μ‹€ν–‰: λ©”λͺ¨λ¦¬ νš¨μœ¨μ μ΄μ§€λ§Œ 반볡 μ—°μ‚° μ‹œ 느림
  • μ¦‰μ‹œ μ‹€ν–‰: λ©”λͺ¨λ¦¬ μ“°μ§€λ§Œ μž¬μ‚¬μš© μ‹œ 빠름
  • yield return은 μ§€μ—° μ‹€ν–‰κ³Ό λΉ„μŠ·ν•˜κ²Œ λ©”λͺ¨λ¦¬ 효율적으둜 데이터 λ°˜ν™˜