2016-06-09 4 views
0

저는 IEqualityComparer와 IEquitable에 대해 연구 해 왔습니다.IEquatable을 사용할 때의 이점

What is the difference between IEqualityComparer<T> and IEquatable<T>?과 같은 게시물에서이 두 가지의 차이는 이제 분명합니다. "IEqualityComparer는 T 유형의 두 객체에 대한 비교를 수행하는 객체의 인터페이스입니다."

https://msdn.microsoft.com/en-us/library/ms132151(v=vs.110).aspx의 예제 다음에 나오는 IEqualityComparer의 목적은 명확하고 간단합니다.

나는 그것을 사용하는 방법을 해결하기 위해 https://dotnetcodr.com/2015/05/05/implementing-the-iequatable-of-t-interface-for-object-equality-with-c-net/의 예를 따라했고 나는 다음과 같은 코드를 얻을 :

class clsIEquitable 
{ 
    public static void mainLaunch() 
    { 
     Person personOne = new Person() { Age = 6, Name = "Eva", Id = 1 }; 
     Person personTwo = new Person() { Age = 7, Name = "Eva", Id = 1 }; 

     //If Person didn't inherit from IEquatable, equals would point to different points in memory. 
     //This means this would be false as both objects are stored in different locations 

     //By using IEquatable on class it compares the objects directly 
     bool p = personOne.Equals(personTwo); 

     bool o = personOne.Id == personTwo.Id; 

     //Here is trying to compare and Object type with Person type and would return false. 
     //To ensure this works we added an overrides on the object equals method and it now works 
     object personThree = new Person() { Age = 7, Name = "Eva", Id = 1 }; 
     bool p2 = personOne.Equals(personThree); 

     Console.WriteLine("Equatable Check", p.ToString()); 

    } 
} 


public class Person : IEquatable<Person> 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int Age { get; set; } 

    public bool Equals(Person other) 
    { 
     if (other == null) return false; 
     return Id == other.Id; 
    } 


    //These are to support creating an object and comparing it to person rather than comparing person to person 

    public override bool Equals(object obj) 
    { 
     if (obj is Person) 
     { 
      Person p = (Person)obj; 
      return Equals(p); 
     } 
     return false; 
    } 

    public override int GetHashCode() 
    { 
     return Id; 
    } 

} 

내가 사용하는 것이 왜 내 질문은? 그것은 아래의 간단한 버전 (부울 O)에 추가 코드의 많은 것 같아 :

 //By using IEquatable on class it compares the objects directly 
    bool p = personOne.Equals(personTwo); 

    bool o = personOne.Id == personTwo.Id; 
+4

* "Id"로 사람을 비교하고 싶다는 것을 알고 계십니다. 'Person '을 저장하는 무작위 컬렉션은 어떻게 알 수 있습니까? –

+1

그리고 'Person'을 비교하기위한 여분의 메트릭을 추가한다고 가정하십시오. 그 때 무엇? 두 개의 'Person'을 비교하고 리팩터링하는 모든 인스턴스를 찾고 아니면 'Equals' 구현을 편집하면됩니까? 이것은 재사용되는 코드의 전형적인 예입니다. – EvilTak

+0

그것의 이렇게 간단한 한번 지적했다! 감사 – Jay1b

답변

3

IEquatable<T>는 평등을 결정하는 일반적인 컬렉션에 의해 사용된다. 이 MSDN 문서 https://msdn.microsoft.com/en-us/library/ms131187.aspx

이러한 방법에서 어떤지를 테스트 할 때 포함로 일반적인 수집에서 사용하는 IEquatable 인터페이스는 사전, 목록 및 LinkedList의 같은 객체

, 같이 IndexOf, lastIndexOf에서도, 그리고 제거에서

. 일반 콜렉션에 저장 될 수있는 모든 오브젝트에 대해 구현되어야합니다. IEquatable<T>object이 방법은 것 같다베이스를 호출 같은 구조체를 상자하지 않는 equals 메소드 호출하기 때문에, 구조체를 사용하는 경우

이 제품은 추가 혜택을 제공한다.

관련 문제