真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Equals與GetHashCode如何在C#中使用-創(chuàng)新互聯(lián)

今天就跟大家聊聊有關(guān)Equals與GetHashCode如何在C#中使用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),山城企業(yè)網(wǎng)站建設(shè),山城品牌網(wǎng)站建設(shè),網(wǎng)站定制,山城網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,山城網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

Equals和GetHashCode

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

  • 自反性(Reflexive): x.equals(x)必須返回true.

  • 對稱性(Symmetric): x.equals(y)為true時,y.equals(x)也為true.

  • 傳遞性(Transitive): 對于任何非null的應(yīng)用值x,y和z,如果x.equals(y)返回true,并且y.equals(z)也返回true,那么x.equals(z)必須返回true.

  • 一致性(Consistence): 如果多次將對象與另一個對象比較,結(jié)果始終相同.只要未修改x和y的應(yīng)用對象,x.equals(y)連續(xù)調(diào)用x.equals(y)返回相同的值l.

  • 非null(Non-null): 如果x不是null,y為null,則x.equals(y)必須為false

GetHashCode:

  • 兩個相等對象根據(jù)equals方法比較時相等,那么這兩個對象中任意一個對象的hashcode方法都必須產(chǎn)生同樣的整數(shù)。

  • 在我們未對對象進行修改時,多次調(diào)用hashcode使用返回同一個整數(shù).在同一個應(yīng)用程序中多次執(zhí)行,每次執(zhí)行返回的整數(shù)可以不一致.

  • 如果兩個對象根據(jù)equals方法比較不相等時,那么調(diào)用這兩個對象中任意一個對象的hashcode方法,不一同的整數(shù)。但不同的對象,產(chǎn)生不同整數(shù),有可能提高散列表的性能.

IEqualityComparer實現(xiàn)

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

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

  public int Age { get; set; }
 }

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

 class Program
 {
  static void Main(string[] args)
  {
   List students = new List
   {
    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();
  }
 }

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

在默認情況下Equals具有以下行為:

  • 如果實例是引用類型,則只有引用相同時, Equals才會返回true。

  • 如果實例是值類型,則僅當(dāng)類型和值相同時, Equals才會返回true。

Distinct(IEnumerable, IEqualityComparer)

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

類型參數(shù)

  • TSource source 的元素類型。

參數(shù)

  • source IEnumerable 要從中移除重復(fù)元素的序列。

  • comparer IEqualityComparer 用于比較值的 IEqualityComparer。

返回

  • IEnumerable

一個包含源序列中的非重復(fù)元素的 IEnumerable。

我們來看如下代碼片段

 public class StudentComparator : EqualityComparer
 {
  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;
  }
 }

上述代碼片段如果兩個Equals返回的true并且GetHashCode返回相同的哈希碼,則認為兩個對象相等.

重寫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ù)期效果.我們將進一步的去實現(xiàn)代碼,以達到預(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方法進行過濾和查詢,同時將會檢查Equals和GetHashCode

 List students = new List
 {
  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

看完上述內(nèi)容,你們對Equals與GetHashCode如何在C#中使用有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計公司行業(yè)資訊頻道,感謝大家的支持。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


當(dāng)前名稱:Equals與GetHashCode如何在C#中使用-創(chuàng)新互聯(lián)
地址分享:http://weahome.cn/article/cejejj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部