두 인터페이스 모두 객체가 같은지 비교하는 것 같습니다. 그렇다면 둘 사이의 주요 차이점은 무엇입니까?
두 인터페이스 모두 객체가 같은지 비교하는 것 같습니다. 그렇다면 둘 사이의 주요 차이점은 무엇입니까?
답변:
IEquatable<T>
평등을 위해.
IComparable<T>
주문을 위해.
Greg D의 답변 외에도 :
부분적 순서가 의미가있는 클래스를 구현 IComparable
하지 않고 구현할 수 IEquatable
있으며 소비자 CompareTo()
가 0을 반환 하기 때문에 소비자가 추론하기를 원할 경우 객체가 동일하다는 것을 의미하지는 않습니다 (정렬 목적 이외의 용도로).
IComparable
입니다. 여기서는 완전히 부적절합니다. 당신이 가진 것은 오직 하나의 특별한 상황에서만 적용되는 매우 특별한 순서입니다. 그러한 상황에서는 장군을 구현하는 IComparable
것이 잘못되었습니다. 이것이 IComparer
거기에있는 것입니다. 예를 들어, 사람을 의미있게 주문할 수 없습니다. 그러나 급여, 신발 사이즈, 주근깨 수 또는 체중에 따라 주문할 수 있습니다. 따라서 우리는 IComparer
이러한 모든 경우에 대해 다른를 구현 합니다.
IEquatable 의 MSDN 페이지에 명시된대로 :
IComparable 인터페이스는
CompareTo
구현 유형의 인스턴스 정렬 순서를 결정 하는 메서드를 정의합니다 . IEquatable 인터페이스는Equals
구현 유형의 인스턴스가 같음을 결정 하는 메서드를 정의합니다 .
Equals
대 CompareTo
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);
false
Equals
메서드가 두 개체를 비교하는 방법을 모르기 때문에 반환 됩니다. 따라서 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;
}
}
}
IEquatable
일반적인를 사용 <Person>
하고 IComparable
하지 않는 이유는 무엇입니까?
IComparable
제대로 구현되는 것보다 특수한 경우 비교 자처럼 들립니다 . 평등을 의미CompareTo(…) == 0
하지 않는 의미 있는 예를 생각해 낼 수 있습니까 ? 나는 확실히 할 수 없다. 사실, 인터페이스 계약 (MSDN에 따라) 은CompareTo(…) == 0
동등성 을 의미합니다. 당신은 특별한 사용으로 이러한 경우에, 솔직하게 말하면Comparator
객체를 수행 하지 구현IComparable
.