IEquatable<T>.Equals 是Object.Equals方法的泛型版本
来源:互联网 发布:生产流程优化工具 编辑:程序博客网 时间:2024/06/05 06:09
The implementation of the Equals method is intended to perform a test for equality with another object of typeT, the same type as the current object. The Equals method is called in the following circumstances:
When the Equals method is called and theother parameter represents a strongly-typed object of typeT. (If other is of typeObject, the baseObject.Equals(Object) method is called. Of the two methods,IEquatable<T>.Equals offers slightly better performance.)
When the search methods of a number of generic collection objects are called. Some of these types and their methods include the following:
Some of the generic overloads of the BinarySearch method.
The search methods of the List<T> class, includingList<T>.Contains(T),List<T>.IndexOf,List<T>.LastIndexOf, andList<T>.Remove.
The search methods of the Dictionary<TKey, TValue> class, includingContainsKey andRemove.
The search methods of the generic LinkedList<T> class, includingLinkedList<T>.Contains andRemove.
In other words, to handle the possibility that objects of a class will be stored in an array or a generic collection object, it is a good idea to implementIEquatable<T> so that the object can be easily identified and manipulated.
两点注意:
1)如果对象需要存储在集合类中,编写这些类时要考虑实现IEquatable<T>.Equals方法以实现判等,实现IComparable<T>接口以实现排序;
2) 集合类中的某些方法例如LinkedList.Find 方法等要利用对象的Equals方法来判断是否相等。
Sample: 观察对象类的Equals, GetHashCode以及operator override
using System;using System.Collections.Generic;using System.Text.RegularExpressions;public class Person : IEquatable<Person>{ private string uniqueSsn; private string lName; public Person(string lastName, string ssn) { this.SSN = ssn; this.LastName = lastName; } public string SSN { get { return this.uniqueSsn; } set { if (Regex.IsMatch(value, @"\d{9}")) uniqueSsn = String.Format("{0}-(1}-{2}", value.Substring(0, 3), value.Substring(3, 2), value.Substring(5, 4)); else if (Regex.IsMatch(value, @"\d{3}-\d{2}-\d{4}")) uniqueSsn = value; else throw new FormatException("The social security number has an invalid format."); } } public string LastName { get { return this.lName; } set { if (String.IsNullOrEmpty(value)) throw new ArgumentException("The last name cannot be null or empty."); else this.lName = value; } } public bool Equals(Person other) { if (other == null) return false; if (this.uniqueSsn == other.SSN) return true; else return false; } public override bool Equals(Object obj) { if (obj == null) return false; Person personObj = obj as Person; if (personObj == null) return false; else return Equals(personObj); } public override int GetHashCode() { return this.SSN.GetHashCode(); } public static bool operator == (Person person1, Person person2) { if ((object)person1 == null || ((object)person2) == null) return Object.Equals(person1, person2); return person1.Equals(person2); } public static bool operator != (Person person1, Person person2) { if (person1 == null || person2 == null) return ! Object.Equals(person1, person2); return ! (person1.Equals(person2)); }}
Test :
public class TestIEquatable{ public static void Main() { // Create a Person object for each job applicant. Person applicant1 = new Person("Jones", "099-29-4999"); Person applicant2 = new Person("Jones", "199-29-3999"); Person applicant3 = new Person("Jones", "299-49-6999"); // Add applicants to a List object. List<Person> applicants = new List<Person>(); applicants.Add(applicant1); applicants.Add(applicant2); applicants.Add(applicant3); // Create a Person object for the final candidate. Person candidate = new Person("Jones", "199-29-3999"); if (applicants.Contains(candidate)) Console.WriteLine("Found {0} (SSN {1}).", candidate.LastName, candidate.SSN); else Console.WriteLine("Applicant {0} not found.", candidate.SSN); // Call the shared inherited Equals(Object, Object) method. // It will in turn call the IEquatable(Of T).Equals implementation. Console.WriteLine("{0}({1}) already on file: {2}.", applicant2.LastName, applicant2.SSN, Person.Equals(applicant2, candidate)); }}// The example displays the following output: // Found Jones (SSN 199-29-3999). // Jones(199-29-3999) already on file: True.
- IEquatable<T>.Equals 是Object.Equals方法的泛型版本
- Object的equals方法
- object的equals方法
- Object的equals方法
- java小记之Object类的equals方法t
- 对象的比较与排序(四):对象的相等判断Equals和IEquatable<T>(转)
- 重载Object equals方法
- Java Object equals方法
- Object类--equals方法
- Object之equals方法
- Object的hashCode方法和equals方法
- Object的equals方法和toString方法
- java 的Object的equals方法
- java Object 的equals方法的复写
- 如何重写Object的Equals方法?
- Object 的俩个方法:equals() hashcode()
- Object对象的通用方法-equals、hashCode
- 解读Object类的equals方法
- 如何编写出拥抱变化的代码?
- sources.list的作用
- QR码编码原理二(编码)
- 在Directshow中使用VMR9
- SqlParameter的作用与用法
- IEquatable<T>.Equals 是Object.Equals方法的泛型版本
- rowid 和 rownum的使用
- LDD3读书笔记------总线, 设备, 和驱动,类
- C#后台调用前台javascript的五种方法
- 服务器程序中如何设计backup task功能
- Boost库编译后命名方式
- 什么是自动减支
- EF学习笔记
- OPENGL顶点数组, glDrawArrays,glDrawElements (转)