IStructuralEquatable 인터페이스
namespace System.Collections
{
public interface IStructuralEquatable
{
bool Equals(object other, IEqualityComparer comparer);
int GetHashCode(IEqualityComparer comparer);
}
}
IStructuralComparable 인터페이스
namespace System.Collections
{
public interface IStructuralComparable
{
int CompareTo(object other, IComparer comparer);
}
}
- .NET 4.0
- 구조체의 기본적인 상등 방식은 구조적 비교(Structural Comparison), 두 구조체의 모든 필드가 상등이면, 구조체간의 상등
반응형
- 배열이나 튜플처럼 구조체가 아닌 형식에 구조적 비교를 적응하는 플러그인 인터페이스
- 인수로 주어진 IEqualitycomparer나 IComparer 객체를 합성 요소의 각 개체에 적용함
using System;
using System.Collections;
using System.Collections.Generic;
namespace Practice
{
class Program
{
public static void Main(string[] arg)
{
// int array
int[] a1 = { 1, 2, 3 };
int[] a2 = new int[a1.Length];
a1.CopyTo(a2, 0);
Console.WriteLine(a1.Equals(a2));
Console.WriteLine(((IStructuralEquatable)a1).Equals(a2, EqualityComparer<int>.Default));
Console.WriteLine(((IStructuralComparable)a1).CompareTo(a2, StringComparer.InvariantCultureIgnoreCase));
Console.WriteLine();
// string array
string[] str1 = "String Array".Split();
string[] str2 = "STRING ARRAY".Split();
Console.WriteLine(str1.Equals(str2));
Console.WriteLine(((IStructuralEquatable)str1).Equals(str2, StringComparer.InvariantCultureIgnoreCase));
Console.WriteLine(((IStructuralComparable)str1).CompareTo(str2, StringComparer.InvariantCultureIgnoreCase));
Console.WriteLine();
// tuple
var tuple1 = Tuple.Create(1, "Tuple");
var tuple2 = Tuple.Create(1, "TUPLE");
Console.WriteLine(tuple1.Equals(tuple2));
Console.WriteLine(((IStructuralEquatable)tuple1).Equals(tuple2, StringComparer.InvariantCultureIgnoreCase));
Console.WriteLine(((IStructuralComparable)tuple1).CompareTo(tuple2, StringComparer.InvariantCultureIgnoreCase));
Console.WriteLine();
// 튜플은 기존 상등 및 비교 구현이 구조적 비교를 따른다.
tuple1 = Tuple.Create(1, "TUPLE");
Console.WriteLine(tuple1.Equals(tuple2));
}
}
}
반응형
'C#' 카테고리의 다른 글
[C#] Debug, Trace (0) | 2023.10.18 |
---|---|
[C#] WeakReference (0) | 2023.10.14 |
[C#] GC, GCSettings, 쓰레기 수거(Garbege Collection) (0) | 2023.10.12 |
[C#] IDisposable (Dispose), 종료자(Finalizer) (0) | 2023.10.10 |
[C#] StringComparer (0) | 2023.10.06 |
[C#] IComparer<T>, IComparer, Comparer<T> (0) | 2023.10.04 |
[C#] IEqualityComparer<T>, IEqualityComparer, EqualityComparer (0) | 2023.10.02 |
[C#] KeyedCollection<TKey,TItem>, DictionaryBase (0) | 2023.09.30 |