Comparer vs Comparable and Enumerable vs Enumerator in C#
Comparer vs Comparable and Enumerable vs Enumerator in C#
1. Comparer and Comparable
1.1 Comparer (IComparer)
- μ μ:
IComparer
λ λ κ°μ²΄λ₯Ό λΉκ΅νλ μΈλΆ λΉκ΅μ μΈν°νμ΄μ€μ λλ€. - μ£Όμ μν : μ λ ¬ κΈ°μ€μ λ³λμ ν΄λμ€λ‘ ꡬνν΄ κ°μ²΄μ μ λ ¬μ μνν©λλ€.
- ν΅μ¬ λ©μλ:
int Compare(object x, object y)
λ₯Ό ꡬννμ¬ λ κ°μ²΄μ ν¬κΈ° λΉκ΅λ₯Ό μνν©λλ€. - μ₯μ : μ¬λ¬ κ°μ§ μ λ ¬ κΈ°μ€μ μ μ©ν μ μμ΅λλ€.
μ¬μ© μμ :
class PointCompare : IComparer<Point>
{
public int Compare(Point x, Point y)
{
return x.X - y.X; // X μ’ν κΈ°μ€ λΉκ΅
}
}
1.2 Comparable (IComparable)
- μ μ:
IComparable
μ ν΄λμ€ λ΄λΆμ λΉκ΅ κΈ°μ€μ ꡬννλ λ΄λΆ λΉκ΅μ μΈν°νμ΄μ€μ λλ€. - μ£Όμ μν : κ°μ²΄κ° μ€μ€λ‘ μ λ ¬ κΈ°μ€μ μ μνλ©°,
CompareTo
λ©μλλ₯Ό ν΅ν΄ λΉκ΅ λ‘μ§μ μ 곡ν©λλ€. - ν΅μ¬ λ©μλ:
int CompareTo(object other)
λ₯Ό ꡬννμ¬ κ°μ²΄ μμ κ³Ό λ€λ₯Έ κ°μ²΄λ₯Ό λΉκ΅ν©λλ€. - μ₯μ : κ°μ²΄ μμ²΄κ° λΉκ΅ κ°λ₯ν μνκ° λ©λλ€.
μ¬μ© μμ :
class Point : IComparable<Point>
{
public int X { get; set; }
public int CompareTo(Point other)
{
return this.X - other.X; // X μ’ν κΈ°μ€ λΉκ΅
}
}
1.3 λΉκ΅ μμ½
| κ΅¬λΆ | Comparer (IComparer) | Comparable (IComparable) |
|ββββββ|βββββββββββ|βββββββββββ|
| λΉκ΅μ | μΈλΆ λΉκ΅μ | λ΄λΆ λΉκ΅μ |
| μ λ ¬ κΈ°μ€ | μ¬λ¬ μ λ ¬ κΈ°μ€ κ΅¬ν κ°λ₯ | νλμ μ λ ¬ κΈ°μ€λ§ ꡬν |
| μ¬μ© λ©μλ | Compare
| CompareTo
|
| κ°μ²΄μ μν | κ°μ²΄λ λΉκ΅ λ‘μ§μ λͺ°λΌλ λ¨ | κ°μ²΄ μ€μ€λ‘ λΉκ΅ κΈ°μ€ μ μ |
2. Enumerable and Enumerator
2.1 Enumerable (IEnumerable)
- μ μ:
IEnumerable
μ 컬λ μ μ΄ μν κ°λ₯νλλ‘ νλ μΈν°νμ΄μ€μ λλ€. - μ£Όμ μν : μ΄κ±°μ(Enumerator)λ₯Ό μ 곡νμ¬
foreach
ꡬ문μμ 컬λ μ μ μνν μ μλλ‘ ν©λλ€. - ν΅μ¬ λ©μλ:
IEnumerator GetEnumerator()
λ₯Ό ꡬνν©λλ€.
μ¬μ© μμ :
class MyCollection : IEnumerable
{
private int[] data = { 1, 2, 3 };
public IEnumerator GetEnumerator()
{
return data.GetEnumerator();
}
}
2.2 Enumerator (IEnumerator)
- μ μ:
IEnumerator
λ 컬λ μ μ μμλ₯Ό μννλ κ°μ²΄μ λλ€. - μ£Όμ μν : 컬λ μ λ΄ μμλ₯Ό νλμ© νμνλ©° νμ¬ μμΉλ₯Ό κ΄λ¦¬ν©λλ€.
- ν΅μ¬ λ©μλ:
MoveNext()
: λ€μ μμλ‘ μ΄λν©λλ€.Current
: νμ¬ μμλ₯Ό λ°νν©λλ€.Reset()
: μ²μμΌλ‘ λμκ°λλ€.
μ¬μ© μμ :
IEnumerator enumerator = myCollection.GetEnumerator();
while (enumerator.MoveNext())
{
Console.WriteLine(enumerator.Current);
}
2.3 λΉκ΅ μμ½
| κ΅¬λΆ | Enumerable (IEnumerable) | Enumerator (IEnumerator) |
|ββββββ|βββββββββββ|βββββββββββ|
| μν | 컬λ μ
μ΄ μν κ°λ₯ν¨μ λνλ | 컬λ μ
μ μμλ₯Ό νλμ© μν |
| μ 곡 λ©μλ | GetEnumerator()
| MoveNext()
, Current
|
| μ¬μ© μμ | foreach
μμ μ νΈμΆ | foreach
λ΄λΆμμ μμ μ κ·Ό |
| κ΄κ³ | μ΄κ±°μλ₯Ό λ°ννλ μν | μ€μ μνλ₯Ό μννλ κ°μ²΄ |
κ²°λ‘
- Comparerλ μΈλΆμμ λΉκ΅λ₯Ό μννλ©°, μ¬λ¬ κΈ°μ€μ μ€μ ν μ μμ΅λλ€.
- Comparableμ κ°μ²΄ λ΄λΆμμ λΉκ΅ κΈ°μ€μ μ μνμ¬ κ°μ²΄ μ체λ₯Ό λΉκ΅ κ°λ₯νκ² λ§λλλ€.
- Enumerableμ 컬λ μ μ΄ μν κ°λ₯ν¨μ λνλ΄λ©°, Enumeratorλ₯Ό λ°νν©λλ€.
- Enumeratorλ 컬λ μ
μ μ€μ λ‘ μννλ κ°μ²΄λ‘,
MoveNext
,Current
,Reset
μ ν΅ν΄ μνλ₯Ό μ μ΄ν©λλ€.