C#學習筆記 IEquatable 介面 IEqualityComparer 介面
阿新 • • 發佈:2019-01-23
IEquatable<T> 介面類內重寫Equals方法,就可以實現比較。IEqualityComparer<T> 介面可以寫一個自定義類的比較類。可以重寫GetHashCode()方法。
using System; using System.Collections.Generic; using System.Collections; namespace Wrox { public class MainEntryPoint { static int Main(string[] args) { var janet = new Person{ FirstName = "Janet",LastName = "Jackson"}; Person[] persons1 = { new Person { FirstName = "Michael", LastName = "Jackson" }, janet }; Person[] persons2 = { new Person { FirstName = "Michael", LastName = "Jackson" }, janet }; if(persons1 != persons2) Console.WriteLine("not the same reference."); /*if((persons1 as IstructuralEquatable).Equals(persons2,EqualityComparer<Person>.Default)) { Console.WriteLine("the same content."); }*/ var t1 = Tuple.Create<int, string>(1,"Stephanie"); var t2 = Tuple.Create<int, string>(1,"Stephanie"); if(t1 != t2) Console.WriteLine("not the same reference to the tuple."); if(t1.Equals(t2)) Console.WriteLine("the same content."); /*if(t1.Equals(t2,new TupleComparer())) Console.WriteLine("equals using TupleComparer.");*/ return 0; } } public class Person:IEquatable<Person> { public int Id { get; set;} public string FirstName { get; set;} public string LastName { get; set;} public override string ToString() { return string.Format("{0} {1} {2}",Id,FirstName,LastName); } public override bool Equals(object obj)//覆蓋基類中的Equals方法 { if(obj == null) return base.Equals(obj); return Equals(obj as Person); } public override int GetHashCode() { return Id.GetHashCode(); } public bool Equals(Person other)//自定義的Equals方法 { if(other == null) return base.Equals(other); return this.Id == other.Id && this.FirstName == other.FirstName && this.LastName == other.LastName; } } public class TupleComparer<T1,T2>:IEqualityComparer { new public bool Equals(object x, object y) { if (x is T1) //if (typeof(x) is string) return true; return x.Equals(y); } public int GetHashCode(object obj) { if (obj is T1) return ((T1) obj).GetHashCode(); else return ((T2) obj).GetHashCode(); //return obj.GetHashCode(); } } }