溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C#中Equals和GetHashCode怎么用

發(fā)布時(shí)間:2021-09-23 11:38:52 來源:億速云 閱讀:143 作者:小新 欄目:編程語言

這篇文章主要介紹C#中Equals和GetHashCode怎么用,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

Equals和GetHashCode

Equals每個(gè)實(shí)現(xiàn)都必須遵循以下約定:

自反性(Reflexive): x.equals(x)必須返回true.  對(duì)稱性(Symmetric): x.equals(y)為true時(shí),y.equals(x)也為true.  傳遞性(Transitive): 對(duì)于任何非null的應(yīng)用值x,y和z,如果x.equals(y)返回true,并且y.equals(z)也返回true,那么x.equals(z)必須返回true.  一致性(Consistence): 如果多次將對(duì)象與另一個(gè)對(duì)象比較,結(jié)果始終相同.只要未修改x和y的應(yīng)用對(duì)象,x.equals(y)連續(xù)調(diào)用x.equals(y)返回相同的值l.  非null(Non-null): 如果x不是null,y為null,則x.equals(y)必須為false

GetHashCode:

兩個(gè)相等對(duì)象根據(jù)equals方法比較時(shí)相等,那么這兩個(gè)對(duì)象中任意一個(gè)對(duì)象的hashcode方法都必須產(chǎn)生同樣的整數(shù)。  在我們未對(duì)對(duì)象進(jìn)行修改時(shí),多次調(diào)用hashcode使用返回同一個(gè)整數(shù).在同一個(gè)應(yīng)用程序中多次執(zhí)行,每次執(zhí)行返回的整數(shù)可以不一致.  如果兩個(gè)對(duì)象根據(jù)equals方法比較不相等時(shí),那么調(diào)用這兩個(gè)對(duì)象中任意一個(gè)對(duì)象的hashcode方法,不一同的整數(shù)。但不同的對(duì)象,產(chǎn)生不同整數(shù),有可能提高散列表的性能.

IEqualityComparer實(shí)現(xiàn)

下面我們創(chuàng)建一個(gè)學(xué)生類,從而進(jìn)一步的實(shí)現(xiàn)我們對(duì)象數(shù)據(jù)的對(duì)比

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

通過如下代碼我們將通過distinct方法實(shí)現(xiàn)我們的過濾.

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

我們需要達(dá)到的是忽略相同數(shù)據(jù)的對(duì)象,但是并沒有達(dá)到我們?nèi)缙诘男Ч?因?yàn)槭莇istinct默認(rèn)比較的是對(duì)象的引用...所以這樣達(dá)不到我們預(yù)期效果.那我們修改一下來實(shí)現(xiàn)我們預(yù)期效果.

在默認(rèn)情況下Equals具有以下行為:

如果實(shí)例是引用類型,則只有引用相同時(shí), Equals才會(huì)返回true。  如果實(shí)例是值類型,則僅當(dāng)類型和值相同時(shí), Equals才會(huì)返回true。

Distinct(IEnumerable, IEqualityComparer)

通過使用指定的 IEqualityComparer 對(duì)值進(jìn)行比較,返回序列中的非重復(fù)元素.

類型參數(shù)

TSource source 的元素類型。

參數(shù)

source IEnumerable 要從中移除重復(fù)元素的序列。  comparer IEqualityComparer 用于比較值的 IEqualityComparer。

返回

IEnumerable

一個(gè)包含源序列中的非重復(fù)元素的 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;  } }

上述代碼片段如果兩個(gè)Equals返回的true并且GetHashCode返回相同的哈希碼,則認(rèn)為兩個(gè)對(duì)象相等.

重寫Equals和GetHashCode

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

上述代碼片段執(zhí)行后結(jié)果非預(yù)期效果.我們將進(jìn)一步的去實(shí)現(xiàn)代碼,以達(dá)到預(yù)期效果....

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 Distinct方法進(jìn)行過濾和查詢,同時(shí)將會(huì)檢查Equals和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

以上是“C#中Equals和GetHashCode怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI