1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      Equals與GetHashCode如何在C#中使用

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

      創(chuàng)新互聯(lián)公司聯(lián)系電話:18980820575,為您提供成都網(wǎng)站建設(shè)網(wǎng)頁設(shè)計及定制高端網(wǎng)站建設(shè)服務(wù),創(chuàng)新互聯(lián)公司網(wǎng)頁制作領(lǐng)域十年,包括服務(wù)器租用等多個行業(yè)擁有多年的網(wǎng)站制作經(jīng)驗,選擇創(chuàng)新互聯(lián)公司,為企業(yè)保駕護航。

      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。

      • 如果實例是值類型,則僅當類型和值相同時, 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)行業(yè)資訊頻道,感謝大家的支持。


      本文標題:Equals與GetHashCode如何在C#中使用
      轉(zhuǎn)載來于:http://www.ef60e0e.cn/article/jgieih.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        杂多县| 兴文县| 廊坊市| 巩义市| 九江市| 图片| 浦县| 康马县| 新乡县| 东平县| 固镇县| 锡林浩特市| 山东省| 井陉县| 开原市| 尚义县| 恩平市| 壤塘县| 大名县| 金湖县| 安龙县| 连山| 澄迈县| 和静县| 山西省| 温泉县| 孝感市| 台东市| 罗甸县| 得荣县| 邮箱| 武夷山市| 河东区| 闵行区| 慈利县| 房产| 阳城县| 博兴县| 依安县| 司法| 扎鲁特旗|