본문 바로가기
C#

[C#] IStructuralEquatable, IStructuralComparable

by DANEW 2023. 10. 8.

IStructuralEquatable 인터페이스

 

IStructuralEquatable 인터페이스 (System.Collections)

개체의 구조가 같은지 비교할 수 있는 메서드를 정의합니다.

learn.microsoft.com

namespace System.Collections
{
    public interface IStructuralEquatable
    {
        bool Equals(object other, IEqualityComparer comparer);
        int GetHashCode(IEqualityComparer comparer);
    }
}

IStructuralComparable 인터페이스

 

IStructuralComparable 인터페이스 (System.Collections)

컬렉션 개체의 구조 비교를 지원합니다.

learn.microsoft.com

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));
        }
    }
}
반응형