1. 程式人生 > >C#學習筆記 IEquatable 介面 IEqualityComparer 介面

C#學習筆記 IEquatable 介面 IEqualityComparer 介面

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();
		}
	}
}