IT박스

IComparable과 IEquatable 인터페이스의 차이점은 무엇입니까?

itboxs 2020. 9. 9. 07:50
반응형

IComparable과 IEquatable 인터페이스의 차이점은 무엇입니까?


두 인터페이스 모두 객체가 같은지 비교하는 것 같습니다. 그렇다면 둘 사이의 주요 차이점은 무엇입니까?


IEquatable 두 개체가 같은지 테스트합니다.

IComparable 비교되는 개체에 전체 순서를 적용합니다.

예를 들어, IEquatable5가 7과 같지 않다고 IComparable말하면 5가 7보다 먼저옵니다.


IEquatable<T> 평등을 위해.

IComparable<T> 주문을 위해.


Greg D의 답변 외에도 :

부분 순서가 의미가있는 클래스에 대해 IEquatable을 구현하지 않고 IComparable을 구현할 수 있으며, 소비자가 CompareTo ()가 0을 반환하기 때문에 추론을 그리기를 원할 경우 개체가 동일하다는 것을 의미하지는 않습니다 . 분류 목적 이외).


IEquatableMSDN 페이지에 명시된대로 :

IComparable 인터페이스는 CompareTo구현 유형의 인스턴스 정렬 순서를 결정 하는 메서드를 정의합니다 . IEquatable 인터페이스는 Equals구현 유형의 인스턴스가 같음을 결정 하는 메서드를 정의합니다 .

EqualsCompareTo


IComparable <T> 객체를 정렬하거나 정렬하는 데 사용할 수있는 유형별 비교 방법을 정의합니다.

IEquatable <T> 평등을 결정하기 위해 구현하는 데 사용할 수있는 일반화 된 방법을 정의합니다.


Person 클래스가 있다고 가정 해 보겠습니다.

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

Person p1 = new Person() { Name = "Person 1", Age = 34 };
Person p2 = new Person() { Name = "Person 2", Age = 31 };
Person p3 = new Person() { Name = "Person 3", Age = 33 };
Person p4 = new Person() { Name = "Person 4", Age = 26 };

List<Person> people = new List<Person> { p1, p2, p3, p4 };

이러한 개체를 정렬하려면을 사용할 수 있습니다 people.Sort();.

그러나 이것은 예외를 던질 것입니다.

여기에 이미지 설명 입력

프레임 워크는 이러한 개체를 정렬하는 방법을 모릅니다. 구현 IComparable인터페이스 를 정렬하는 방법을 알려줄 필요가 있습니다.

public class Person : IComparable
{
    public string Name { get; set; }
    public int Age { get; set; }

    public int CompareTo(object obj)
    {
        Person otherPerson = obj as Person;
        if (otherPerson == null)
        {
            throw new ArgumentNullException();
        }
        else
        {
            return Age.CompareTo(otherPerson.Age);
        }
    }
}

Sort()메서드를 사용 하여 배열을 적절하게 정렬합니다 .


다음으로 두 개체를 비교하려면 Equals()방법 을 사용할 수 있습니다 .

var newPerson = new Person() { Name = "Person 1", Age = 34 };
var newPersonIsPerson1 = newPerson.Equals(p1);

falseEquals메서드가 두 개체를 비교하는 방법을 모르기 때문에 반환 됩니다. 따라서 IEquatable인터페이스 를 구현 하고 프레임 워크에 비교 방법을 알려야합니다. 이전 예제를 확장하면 다음과 같이 보일 것입니다.

public class Person : IComparable, IEquatable<Person>
{
    //Some code hidden

    public bool Equals(Person other)
    {
        if (Age == other.Age && Name == other.Name)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

참고 URL : https://stackoverflow.com/questions/2410101/whats-the-difference-between-icomparable-iequatable-interfaces

반응형