標籤:三十七 eric ble over obj rom zhang sam write
結構比較
數組和元組都實現介面IStructuralEquatable和IStructuralComparable.這兩個介面不僅可以比較引用,還可以比較內容.這些介面都是顯示實現的,所以在使用時需要把數組和元組強制轉換為這個介面.IStructuralEquatable介面用於比較兩個元組或數組是否有相同的內容,IStructuralComparable介面用於給元組或數組排序.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 結構比較
{
class Program
{
static void Main(string[] args)
{
//建立兩個Person項的數組.
//比較子!=返回true
//因為這其實是兩個變數p1和p2引用的兩個不同數組.
//因為array類沒有重寫帶一個參數的Equals()放大,所以用"=="運算子
//比較引用會得到相同的結構,即這兩個變數不相同
Person zhangsan = new Person { FirstName = "zhang", LastName = "san" };
Person[] p1 = {
new Person
{
FirstName="lisi"
} ,
zhangsan
};
Person[] p2 = {
new Person
{
FirstName="lisi"
} ,
zhangsan
};
if (p1!=p2)
{
Console.WriteLine("not the same reference"); ;
}
Console.ReadKey();
}
}
public class Person : IEquatable<Person>
{
public int ID { get; set; }
public string FirstName { set; get; }
public string LastName { set; get; }
public override string ToString()
{
return string.Format("{0},{1}{2}", ID, FirstName, LastName); ;
}
public override bool Equals(object obj)
{
if (obj == null)
{
throw new ArgumentNullException("obj");
}
return Equals(obj as Person);
}
public override int GetHashCode()
{
return ID.GetHashCode();
}
public bool Equals(Person other)
{
if (other == null)
{
throw new ArgumentNullException("other");
}
return this.ID == other.ID && this.FirstName == other.FirstName && this.LastName == other.LastName;
}
}
}
使用實現IEquatable介面的Person類.IEquatable介面定義了一個強型別化的Equals()方法,用來比較FirstName和LastName屬性的值.
下面看看如何對元組執行相同的操作.這裡建立了兩個內容相同的元組執行個體:
var t1 = Tuple.Create<string, int>("zhangsan", 19);
var t2 = Tuple.Create<string, int>("zhangsan", 19);
//因為t1和t2引用了兩個不同的對象,所以比較子"!="返回true
if (t1 != t2)
{
Console.WriteLine("not the same reference to the tuple");
}
//這會調用object.equals()方法比較元組的每一項,每一項都返回true
if (t1.Equals(t2))
{
Console.WriteLine("the same reference to the tuple");
}
Tuple<>類提供了兩個Equals()方法:一個重寫了object基類中的Equals()方法,並把object作為參數,第二個由IStructyralEqualityComparer介面定義,並把object和IequalityComparer作為參數.
還可以使用類TupleCOmparer建立一個自訂的UequalityComparer,這個類實現了IEqualityComparer介面的兩個方法Equals()和GetHashCode():
public class TupleComparer : IEqualityComparer
{
public bool Equals(object x, object y)
{
return x.Equals(y);
}
public int GetHashCode(object obj)
{
return obj.GetHashCode();
}
}
實現IEqualityCOmparer介面的Equals()方法需要new修飾符或者隱式實現的介面,因為基類object也定義了帶兩個參數的靜態Equals()方法.
使用TupleComparer,給Tuple<T1,T2>類的Equals()方法傳遞一個新執行個體.Tuple類的Equals(0方法為要比較的每一項調用TupleComparer的Equals()方法.所以,對於Tuple<T1,T2>類,要調用兩次TupleCOmparer,以檢查所有項是否相等.
C#編程(三十七)----------結構比較