IComparable과 IEquatable 인터페이스의 차이점은 무엇입니까?
두 인터페이스 모두 객체가 같은지 비교하는 것 같습니다. 그렇다면 둘 사이의 주요 차이점은 무엇입니까?
IEquatable
두 개체가 같은지 테스트합니다.
IComparable
비교되는 개체에 전체 순서를 적용합니다.
예를 들어, IEquatable
5가 7과 같지 않다고 IComparable
말하면 5가 7보다 먼저옵니다.
IEquatable<T>
평등을 위해.
IComparable<T>
주문을 위해.
Greg D의 답변 외에도 :
부분 순서가 의미가있는 클래스에 대해 IEquatable을 구현하지 않고 IComparable을 구현할 수 있으며, 소비자가 CompareTo ()가 0을 반환하기 때문에 추론을 그리기를 원할 경우 개체가 동일하다는 것을 의미하지는 않습니다 . 분류 목적 이외).
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;
}
}
}
'IT박스' 카테고리의 다른 글
django 쿼리에 해당하는 SQL“LIKE” (0) | 2020.09.09 |
---|---|
.Net 리소스 파일 (App_GlobalResources)의 캐리지 리턴 / 줄 바꿈 (0) | 2020.09.09 |
알파벳 순서로 File.listFiles하는 방법? (0) | 2020.09.09 |
a : before에서 밑줄 만 제거하는 방법은 무엇입니까? (0) | 2020.09.09 |
Grunt.js 복사를 사용하여 디렉토리의 모든 파일을 다른 디렉토리로 복사하십시오. (0) | 2020.09.09 |