C #을 재정의 같음과 GetHashCode GetHashCode 및 C #에서 같음

C #을 같음 및 GetHashCode에서

 

같음 和 GetHashCode

각 구현은 다음과 같은 규칙을 따라야합니다 같음 :

  • 재귀 (재귀)  는, x.equals (X 축)가 true를 반환해야합니다.
  • 대칭 (대칭은)  는, x.equals들 (Y)는 사실, 한편 y.equals (X)도 마찬가지이다.
  • : 이행 성 (이적)  x.equals (y)가 true를 리턴 true를 반환하고, X, Y 및 Z 널이 아닌 값을 응용 프로그램에 대해, 한편 y.equals 및 (z), x.equals (z)는 true를 반환해야 .
  • 일관성 (일관성)는 :  다른 객체에 여러 비교 대상이 결과는 긴 수정되지 않은 응용 프로그램 개체의 x와 y로 항상 같은 경우는, x.equals (y)를 연속 통화는, x.equals (y)는 같은 값의 리터를 반환합니다. .
  • 비 - 널 (null 이외) :  X는 널 (null)이 아닌 경우, Y는 널 (null)에 대해, x.equals (y)가 거짓이어야

GetHashCode :

  • 두 물체가 비교의 방법과 동일 같음에있어서 동일하고, 그 다음 개체로 두 개체가있어서 동일한 해시 정수를 생성한다.
  • 우리가 수정 반대하지 않자, 같은 해시 코드의 정수를 반환합니다. 실행 된 여러 번 동일한 응용 프로그램 내에서 여러 호출을 사용, 각 정수 실행 반환 일치하지 않을 수 있습니다.
  • (가) 다음없는 정수로, 해당 오브젝트의 해시 두 객체의 메소드를 호출하는 방법에있어서 동일하지 않은 비교 동일하면 두 개체. 그러나, 다른 정수가 다른 개체, 해시 테이블의 성능을 향상시킬 수있다.

달성 IEqualityComparer

하자 더 목표 비교 데이터를 달성하기 위해 학생들의 클래스를 생성

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

우리는 다음과 같은 방법은 별개의 코드를 통해 여과 얻을 것이다.

    class Program
    {
        static void Main(string[] args) { List<Student> students = new List<Student> { new Student{ Name = "MR.A", Age = 32}, new Student{ Name = "MR.B", Age = 34}, new Student{ Name = "MR.A", Age = 32} }; Console.WriteLine("distinctStudents has Count = {0}", students.Distinct().Count());//distinctStudents has Count = 3 Console.ReadLine(); } }

우리는 이런 식으로 우리가 원하는 결과에 도달 ... 같은 데이터 객체를 무시하는 것입니다 달성하기 위해 필요하지만, 우리의 일정 결과에 부합하지 않았다. 그것은 별개의 기본 비교 객체에 대한 참조입니다 때문입니다. 그리고 우리는 우리의 기대를 달성하기 위해 수정 효과.

기본 같음으로 다음과 같은 문제가 있습니다 :

  • 인스턴스가 참조 형식, 동일한 경우, 같음 사실은 참조를 반환합니다.
  • 인스턴스가 값 형식 인 경우에만 단지 유형과 값의 경우 true를 반환 같음, 동일합니다.

고유 (IEnumerable을, IEqualityComparer)

상기 비 반복 시퀀스 요소로 반환 값을 비교하도록 지정된 IEqualityComparer 사용함으로써.

유형 매개 변수

  • 요소 유형의 TSource 소스.

    매개 변수

  • 소스는  IEnumerable에서이 요소에서 중복 시퀀스를 제거합니다.
  • 비교 자  IEqualityComparer IEqualityComparer 비교 값.

반환

  • IEnumerable을
    별개의 요소를 포함하는 IEnumerable을 소스 시퀀스.

우리는 다음의 코드를 보면

    public class StudentComparator : EqualityComparer<Student> { public override bool Equals(Student x,Student y) { return x.Name == y.Name && x.Age == y.Age; } public override int GetHashCode(Student obj) { return obj.Name.GetHashCode() * obj.Age; } }

위의 두 코드 조각은 GetHashCode가 같은 해시 코드를 true를 반환하고 반환 같음 경우, 두 개체가 동일한 것으로 간주됩니다.

같음과 GetHashCode를 오버라이드 (override)

var stu1 = new Student { Name = "MR.A", Age = 32 };
var stu2 = new Student { Name = "MR.A", Age = 32 }; bool result = stu1.Equals(stu2); //false because it's reference Equals

예상치 못한 결과를 초래할 조각 위의 코드를 실행 한 후. 우리는 원하는 결과를 달성하기 위해 코드를 구현하는 것입니다 ....

    public class Student
    {
        public string Name { get; set; } public int Age { get; set; } public override bool Equals(object obj) { var stu = obj as Student; if (stu == null) return false; return Name == stu.Name && Age == stu.Age; } public override int GetHashCode() { return Name.GetHashCode() * Age; } } var stu1 = new Student { Name = "MR.A", Age = 32 }; var stu2 = new Student { Name = "MR.A", Age = 32 }; bool result = stu1.Equals(stu2); //result is true

우리는 다음 필터링 및 쿼리의 LINQ 고유 한 방법을 사용하고, 같음과 GetHashCode를 확인합니다

    List<Student> students = new List<Student>
    {
        new Student{ Name = "MR.A", Age = 32},
        new Student{ Name = "MR.B", Age = 34}, new Student{ Name = "MR.A", Age = 32} }; Console.WriteLine("distinctStudents has Count = {0}", students.Distinct().Count()); //distinctStudents has Count = 2

저자 : 펭 후이 @
출처 : https://www.cnblogs.com/yyfh/p/12245916.html

같음 和 GetHashCode

각 구현은 다음과 같은 규칙을 따라야합니다 같음 :

  • 재귀 (재귀)  는, x.equals (X 축)가 true를 반환해야합니다.
  • 대칭 (대칭은)  는, x.equals들 (Y)는 사실, 한편 y.equals (X)도 마찬가지이다.
  • : 이행 성 (이적)  x.equals (y)가 true를 리턴 true를 반환하고, X, Y 및 Z 널이 아닌 값을 응용 프로그램에 대해, 한편 y.equals 및 (z), x.equals (z)는 true를 반환해야 .
  • 일관성 (일관성)는 :  다른 객체에 여러 비교 대상이 결과는 긴 수정되지 않은 응용 프로그램 개체의 x와 y로 항상 같은 경우는, x.equals (y)를 연속 통화는, x.equals (y)는 같은 값의 리터를 반환합니다. .
  • 비 - 널 (null 이외) :  X는 널 (null)이 아닌 경우, Y는 널 (null)에 대해, x.equals (y)가 거짓이어야

GetHashCode :

  • 두 물체가 비교의 방법과 동일 같음에있어서 동일하고, 그 다음 개체로 두 개체가있어서 동일한 해시 정수를 생성한다.
  • 우리가 수정 반대하지 않자, 같은 해시 코드의 정수를 반환합니다. 실행 된 여러 번 동일한 응용 프로그램 내에서 여러 호출을 사용, 각 정수 실행 반환 일치하지 않을 수 있습니다.
  • (가) 다음없는 정수로, 해당 오브젝트의 해시 두 객체의 메소드를 호출하는 방법에있어서 동일하지 않은 비교 동일하면 두 개체. 그러나, 다른 정수가 다른 개체, 해시 테이블의 성능을 향상시킬 수있다.

달성 IEqualityComparer

하자 더 목표 비교 데이터를 달성하기 위해 학생들의 클래스를 생성

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

우리는 다음과 같은 방법은 별개의 코드를 통해 여과 얻을 것이다.

    class Program
    {
        static void Main(string[] args) { List<Student> students = new List<Student> { new Student{ Name = "MR.A", Age = 32}, new Student{ Name = "MR.B", Age = 34}, new Student{ Name = "MR.A", Age = 32} }; Console.WriteLine("distinctStudents has Count = {0}", students.Distinct().Count());//distinctStudents has Count = 3 Console.ReadLine(); } }

우리는 이런 식으로 우리가 원하는 결과에 도달 ... 같은 데이터 객체를 무시하는 것입니다 달성하기 위해 필요하지만, 우리의 일정 결과에 부합하지 않았다. 그것은 별개의 기본 비교 객체에 대한 참조입니다 때문입니다. 그리고 우리는 우리의 기대를 달성하기 위해 수정 효과.

기본 같음으로 다음과 같은 문제가 있습니다 :

  • 인스턴스가 참조 형식, 동일한 경우, 같음 사실은 참조를 반환합니다.
  • 인스턴스가 값 형식 인 경우에만 단지 유형과 값의 경우 true를 반환 같음, 동일합니다.

고유 (IEnumerable을, IEqualityComparer)

상기 비 반복 시퀀스 요소로 반환 값을 비교하도록 지정된 IEqualityComparer 사용함으로써.

유형 매개 변수

  • 요소 유형의 TSource 소스.

    매개 변수

  • 소스는  IEnumerable에서이 요소에서 중복 시퀀스를 제거합니다.
  • 비교 자  IEqualityComparer IEqualityComparer 비교 값.

반환

  • IEnumerable을
    별개의 요소를 포함하는 IEnumerable을 소스 시퀀스.

우리는 다음의 코드를 보면

    public class StudentComparator : EqualityComparer<Student> { public override bool Equals(Student x,Student y) { return x.Name == y.Name && x.Age == y.Age; } public override int GetHashCode(Student obj) { return obj.Name.GetHashCode() * obj.Age; } }

위의 두 코드 조각은 GetHashCode가 같은 해시 코드를 true를 반환하고 반환 같음 경우, 두 개체가 동일한 것으로 간주됩니다.

같음과 GetHashCode를 오버라이드 (override)

var stu1 = new Student { Name = "MR.A", Age = 32 };
var stu2 = new Student { Name = "MR.A", Age = 32 }; bool result = stu1.Equals(stu2); //false because it's reference Equals

예상치 못한 결과를 초래할 조각 위의 코드를 실행 한 후. 우리는 원하는 결과를 달성하기 위해 코드를 구현하는 것입니다 ....

    public class Student
    {
        public string Name { get; set; } public int Age { get; set; } public override bool Equals(object obj) { var stu = obj as Student; if (stu == null) return false; return Name == stu.Name && Age == stu.Age; } public override int GetHashCode() { return Name.GetHashCode() * Age; } } var stu1 = new Student { Name = "MR.A", Age = 32 }; var stu2 = new Student { Name = "MR.A", Age = 32 }; bool result = stu1.Equals(stu2); //result is true

우리는 다음 필터링 및 쿼리의 LINQ 고유 한 방법을 사용하고, 같음과 GetHashCode를 확인합니다

    List<Student> students = new List<Student>
    {
        new Student{ Name = "MR.A", Age = 32},
        new Student{ Name = "MR.B", Age = 34}, new Student{ Name = "MR.A", Age = 32} }; Console.WriteLine("distinctStudents has Count = {0}", students.Distinct().Count()); //distinctStudents has Count = 2

저자 : 펭 후이 @
출처 : https://www.cnblogs.com/yyfh/p/12245916.html

추천

출처www.cnblogs.com/Leo_wl/p/12448380.html