LINQ method
LINQ λ©μλμ λν λ³΄κ³ μ
1. LINQ κ°μ
LINQ(Language Integrated Query)λ .NET μΈμ΄(C#, VB.NET λ±)μμ 컬λ μ λ°μ΄ν°λ₯Ό μ½κ² μ§μνκ³ μ‘°μν μ μλλ‘ μ§μνλ κΈ°λ₯μ λλ€. LINQλ λ€μν λ©μλλ₯Ό μ 곡νλ©° 컬λ μ (λ°°μ΄, 리μ€νΈ λ±)μ λν μ λ ¬, νν°λ§, λ³ν λ±μ μμ μ μνν©λλ€.
LINQ λ©μλλ μΌλ°μ μΌλ‘ μ§μ° μ€ν(Deferred Execution)κ³Ό μ¦μ μ€ν(Immediate Execution)μ κΈ°λ°μΌλ‘ λμν©λλ€.
2. LINQ μ£Όμ λ©μλ λΆμ
2.1 OrderBy λ©μλ
- μν : 컬λ μ μ μμλ₯Ό νΉμ κΈ°μ€μ λ°λΌ μ€λ¦μ°¨μμΌλ‘ μ λ ¬ν©λλ€.
- λ°νκ°:
IEnumerable<T>
ννλ‘ κ²°κ³Όλ₯Ό λ°νν©λλ€. - μ§μ° μ€ν:
OrderBy
λ©μλλ νΈμΆ μμ μλ μ°μ°μ΄ μνλμ§ μκ³ , 컬λ μ μ μ΄κ±°ν λ(μ:foreach
λλToList
) μ λ ¬μ΄ μνλ©λλ€.
μμ μ½λ
var sortedList = arr.OrderBy(v => v);
v => v
: μμ μ체λ₯Ό μ λ ¬ κΈ°μ€μΌλ‘ μ¬μ©ν©λλ€.
μ€λͺ
: μ΄ μ½λμμλ λ°°μ΄ arr
μ κ°μ μ€λ¦μ°¨μμΌλ‘ μ λ ¬νμ§λ§, OrderBy
λ μμ§ μ€νλμ§ μμ μνμ
λλ€.
2.2 Where λ©μλ
- μν : 컬λ μ μ μμ μ€ νΉμ 쑰건μ λ§λ μμλ§ νν°λ§ν©λλ€.
- λ°νκ°:
IEnumerable<T>
ννλ‘ κ²°κ³Όλ₯Ό λ°νν©λλ€. - μ§μ° μ€ν:
Where
λ©μλλ 쑰건μ μ€μ ν λΏ, μ€μ μ°μ°μ λ°μ΄ν° μ΄κ±° μμ μ μνλ©λλ€.
μμ μ½λ
var evenNumbers = arr.Where(v => v % 2 == 0);
- 쑰건:
v % 2 == 0
β μ§μμΈ μμλ§ νν°λ§ν©λλ€.
μ€λͺ
: Where
λ 쑰건μ λ§λ λ°μ΄ν°λ₯Ό λ°ννμ§λ§, μ΄ μμ μμ μ€μ λ°μ΄ν° μ°μ°μ΄ μνλμ§λ μμ΅λλ€.
2.3 ToList λ©μλ
- μν :
IEnumerable<T>
ννμ λ°μ΄ν°λ₯Ό μ¦μ μ€ννκ³ κ²°κ³Όλ₯ΌList<T>
λ‘ λ³νν©λλ€. - μ¦μ μ€ν:
ToList()
λ₯Ό νΈμΆνλ©΄ LINQ μ°μ°μ΄ μ¦μ μ€νλμ΄ κ²°κ³Όκ° λ©λͺ¨λ¦¬μ μ μ₯λ©λλ€. - μ©λ:
- κ²°κ³Όλ₯Ό λ©λͺ¨λ¦¬μ μ μ₯ν΄ λΉ λ₯΄κ² μ¬μ¬μ©νκ³ μ ν λ μ¬μ©ν©λλ€.
- LINQ λ©μλμμ λ°νλ
IEnumerable<T>
λ₯ΌList
ννλ‘ λ³νν΄ νΉμ λ©μλ(μ:ForEach
)λ₯Ό μ¬μ©νκ³ μ ν λ νμν©λλ€.
μμ μ½λ
var evenList = arr.Where(v => v % 2 == 0).ToList();
Where
λ₯Ό ν΅ν΄ νν°λ§λ λ°μ΄ν°λ₯Ό μ¦μ μ€ννκ³ , κ²°κ³Όλ₯ΌList<int>
ννλ‘ μ μ₯ν©λλ€.
2.4 yield ν€μλμ μ§μ° μ€ν
- μν :
yield return
ν€μλλ₯Ό μ¬μ©νλ©΄ λ°μ΄ν°λ₯Ό μμ°¨μ μΌλ‘ λ°νν μ μμ΅λλ€. - μ§μ° μ€ν:
yield return
μ λ°μ΄ν°λ₯Ό νλμ© λ°ννλ©°, λ€μ μμλ₯Ό μμ²λ°μ λκΉμ§ μ€νμ μ€μ§ν©λλ€. μ΄λ‘ μΈν΄ λ©λͺ¨λ¦¬ μ¬μ©λμ μ΅μνν μ μμ΅λλ€. - μ¬μ© μμ : ν° λ°μ΄ν°λ₯Ό μ²λ¦¬νκ±°λ 쑰건μ λ°λΌ λ°μ΄ν°λ₯Ό μμ°¨μ μΌλ‘ λ°νν΄μΌ ν λ μ μ©ν©λλ€.
yieldμ GetEnumerator
-
yield return
μ μ¬μ©νλ©΄ μ»΄νμΌλ¬κ° μλμΌλ‘IEnumerable
κ³ΌIEnumerator
λ₯Ό ꡬνν΄ μ€λλ€. -
yield
λ₯Ό μ¬μ©νλ©΄ λ°μ΄ν°λ₯Ό μμ°¨μ μΌλ‘ λ°ννλ μν κΈ°κ³(state machine)κ° μμ±λμ΄GetEnumerator
μ λμμ κ°λ¨νκ² μ²λ¦¬ν©λλ€.
μμ μ½λ
IEnumerable<int> GetEvenNumbers(int[] arr)
{
foreach (var v in arr)
// `foreach`λ `IEnumerable` λλ `IEnumerable<T>`λ₯Ό ꡬνν λͺ¨λ νμ
μμ μ¬μ©ν μ μμ΅λλ€. `List<T>`μ νμ λμ§ μμ΅λλ€.
{
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
μ€λͺ :
yield return
μ 쑰건μ λ§λ λ°μ΄ν°λ₯Ό μμ°¨μ μΌλ‘ λ°νν©λλ€.- λ°μ΄ν°λ₯Ό μμ²ν λλ§ μ‘°κ±΄ κ²μ¬κ° μ€νλλ―λ‘ λ©λͺ¨λ¦¬ ν¨μ¨μ μ λλ€.
- μ§μ° μ€νμ λνμ μΈ μμμ λλ€.
μ»΄νμΌ ν λμ:
-
GetEvenNumbers
λ©μλλIEnumerable<int>
λ₯Ό λ°νν©λλ€. -
yield return
μIEnumerator
κ°μ²΄λ₯Ό μμ±νκ³ μνλ₯Ό μ μ₯ν©λλ€. -
foreach
루νκ°GetEnumerator()
λ₯Ό νΈμΆνλ©΄ μνκ° μ μ§λ μ΄κ±°μκ° μ€νλ©λλ€.
-
IEnumerable
μ ꡬννλ λͺ¨λ 컬λ μ μGetEnumerator
λ₯Ό ν΅ν΄ μ΄κ±°μ(IEnumerator
)λ₯Ό λ°νν©λλ€. -
yield
λ μ»΄νμΌλ¬κ°GetEnumerator
λ©μλμ μν κ΄λ¦¬λ₯Ό μλμΌλ‘ μμ±νλλ‘ λμμ€λλ€. -
볡μ‘ν
IEnumerator
ꡬν μμ΄λyield
λ₯Ό ν΅ν΄ κ°κ²°νκ² λ°μ΄ν°λ₯Ό μμ°¨μ μΌλ‘ λ°νν μ μμ΅λλ€.
3. μ§μ° μ€ν vs μ¦μ μ€ν
3.1 μ§μ° μ€ν (Deferred Execution)
OrderBy
,Where
μ κ°μ LINQ λ©μλλ μ§μ° μ€νμ μ¬μ©ν©λλ€.- λ°μ΄ν° μ°μ°μ 컬λ μ
μ΄ μ΄κ±°λλ μμ μ μνλ©λλ€. (μ:
foreach
,.ToList()
νΈμΆ)
μ₯μ :
- λ©λͺ¨λ¦¬ μ¬μ©μ΄ μ΅μ νλ©λλ€.
- λΆνμν μ°μ°μ νΌν μ μμ΅λλ€.
λ¨μ :
- λμΌν μ°μ°μ μ¬λ¬ λ² μ΄κ±°νλ©΄ λ€μ κ³μ°μ΄ μνλ©λλ€.
μμ
var query = arr.Where(v => v % 2 == 0);
foreach (var item in query)
{
Console.WriteLine(item);
}
Where
λ μ§μ° μ€νλλ―λ‘foreach
λ₯Ό νΈμΆν λ μ€μ νν°λ§μ΄ μνλ©λλ€.
3.2 μ¦μ μ€ν (Immediate Execution)
ToList()
λToArray()
λ₯Ό νΈμΆνλ©΄ LINQ μ°μ°μ΄ μ¦μ μ€νλ©λλ€.- κ²°κ³Όλ λ©λͺ¨λ¦¬μ μ μ₯λλ―λ‘ μ΄νμλ λΉ λ₯΄κ² μ κ·Όν μ μμ΅λλ€.
μ₯μ :
- κ²°κ³Όκ° ν λ² κ³μ°λκ³ λ©λͺ¨λ¦¬μ μ μ₯λ©λλ€.
- λμΌν λ°μ΄ν°λ₯Ό μ¬λ¬ λ² μ¬μ©ν λ μ±λ₯μ΄ κ°μ λ©λλ€.
λ¨μ :
- λ©λͺ¨λ¦¬λ₯Ό μΆκ°λ‘ μ°¨μ§ν©λλ€.
μμ
var result = arr.Where(v => v % 2 == 0).ToList();
ToList()
νΈμΆ μμ μ νν°λ§μ΄ μ¦μ μ€νλκ³ κ²°κ³Όκ°List<int>
λ‘ μ μ₯λ©λλ€.
4. IEnumerableμ Listμ μ°¨μ΄μ
κ΅¬λΆ | IEnumerable |
List |
---|---|---|
μ€ν λ°©μ | μ§μ° μ€ν (μ°μ°μ νμν λ μν) | μ¦μ μ€ν (λ°μ΄ν°λ₯Ό λ©λͺ¨λ¦¬μ μ μ₯) |
λ°μ΄ν° μ μ₯ | λ°μ΄ν° μ μ₯ μμ (μ€μκ° μ°μ°) | λ°μ΄ν°λ₯Ό λ©λͺ¨λ¦¬μ μ μ₯ |
μ¬μ¬μ©μ± | μ°μ° μλ§λ€ λ€μ κ³μ° | μ΄λ―Έ μ μ₯λ κ²°κ³Όλ₯Ό μ¬μ¬μ© |
μ±λ₯ | λ©λͺ¨λ¦¬ ν¨μ¨μ | μ°μ° μ΄ν μ κ·Ό μλ λΉ λ¦ |
5. μ’ ν© μμ
μλλ OrderBy
, Where
, ToList
λ©μλκ° μ‘°ν©λ μμ μ
λλ€.
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)); // κ²°κ³Ό μΆλ ₯
// int[] arr = { 30, 56, 78, 45, 12, 99, 33 };
// IEnumerable<int> sub1 = arr.OrderBy((v) => v);
// IEnumerable<int> sub2 = sub1.Where((v) => v % 2 == 0);
// List<int> lt = sub2.ToList();
// lt.ForEach((v) => { Console.WriteLine(v); });
}
}
μ€ν κ²°κ³Ό:
2
4
μ€λͺ :
OrderBy
λ‘ λ°°μ΄μ μ€λ¦μ°¨μ μ λ ¬ν©λλ€.Where
λ‘ μ§μλ§ νν°λ§ν©λλ€.ToList()
λ‘ κ²°κ³Όλ₯Ό μ¦μ μ€ννκ³List<int>
λ‘ λ³νν©λλ€.ForEach
λ₯Ό μ¬μ©ν΄ κ²°κ³Όλ₯Ό μΆλ ₯ν©λλ€.
6. κ²°λ‘
LINQ λ©μλλ λ°μ΄ν°λ₯Ό μ λ ¬(OrderBy
), νν°λ§(Where
), λ³ν(ToList
)νλ κΈ°λ₯μ μ 곡νλ©°, μ§μ° μ€νκ³Ό μ¦μ μ€νμ κ°λ
μ μ΄ν΄νλ κ²μ΄ μ€μν©λλ€. μ§μ° μ€νμ λ©λͺ¨λ¦¬ ν¨μ¨μ μ΄μ§λ§ λ°λ³΅ μ°μ° μ μ±λ₯ μ νκ° λ°μν μ μκ³ , μ¦μ μ€νμ λ©λͺ¨λ¦¬λ₯Ό μ¬μ©νμ§λ§ κ²°κ³Όλ₯Ό λΉ λ₯΄κ² μ¬μ¬μ©ν μ μμ΅λλ€.
yield return
μ LINQμ μ§μ° μ€νκ³Ό μ μ¬ν λ°©μμΌλ‘ λ°μ΄ν°λ₯Ό μμ°¨μ μΌλ‘ λ°ννμ¬ λ©λͺ¨λ¦¬ μ¬μ©μ μ΅μνν μ μμ΅λλ€. LINQλ₯Ό ν¨κ³Όμ μΌλ‘ μ¬μ©νκΈ° μν΄μλ IEnumerable
μ List
μ μ°¨μ΄μ , κ° λ©μλμ λμ λ°©μ, μ€ν μμ μ λͺ
νν μ΄ν΄ν΄μΌ ν©λλ€.