最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中Equals和GetHashCode使用及區(qū)別

 更新時(shí)間:2020年02月03日 14:27:14   作者:HueiFeng  
這篇文章主要介紹了C#中Equals和GetHashCode使用及區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

Equals和GetHashCode

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

  • 自反性(Reflexive): x.equals(x)必須返回true.
  • 對(duì)稱(chēng)性(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é)生類(lèi),從而進(jìn)一步的實(shí)現(xiàn)我們對(duì)象數(shù)據(jù)的對(duì)比

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

  public int Age { get; set; }
 }

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

 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ì)象,但是并沒(méi)有達(dá)到我們?nèi)缙诘男Ч?因?yàn)槭莇istinct默認(rèn)比較的是對(duì)象的引用...所以這樣達(dá)不到我們預(yù)期效果.那我們修改一下來(lái)實(shí)現(xiàn)我們預(yù)期效果.

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

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

Distinct(IEnumerable, IEqualityComparer)

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

類(lèi)型參數(shù)

  • TSource source 的元素類(lèi)型。

參數(shù)

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

返回

  • IEnumerable

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

我們來(lái)看如下代碼片段

 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ì)象相等.

重寫(xiě)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

我們?cè)偈褂肔INQ Distinct方法進(jìn)行過(guò)濾和查詢(xú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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

作者:@馮輝
出處:https://www.cnblogs.com/yyfh/p/12245916.html?utm_source=tuicool&utm_medium=referral

相關(guān)文章

  • C#中winform窗體實(shí)現(xiàn)注冊(cè)/登錄功能實(shí)例(DBHelper類(lèi))

    C#中winform窗體實(shí)現(xiàn)注冊(cè)/登錄功能實(shí)例(DBHelper類(lèi))

    在編寫(xiě)項(xiàng)目時(shí),編寫(xiě)了一部分關(guān)于登錄頁(yè)面的一些代碼,下面這篇文章主要給大家介紹了關(guān)于C#中winform窗體實(shí)現(xiàn)注冊(cè)/登錄功能(DBHelper類(lèi))的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • C#使用SQL DataReader訪問(wèn)數(shù)據(jù)的優(yōu)點(diǎn)和實(shí)例

    C#使用SQL DataReader訪問(wèn)數(shù)據(jù)的優(yōu)點(diǎn)和實(shí)例

    今天小編就為大家分享一篇關(guān)于C#使用SQL DataReader訪問(wèn)數(shù)據(jù)的優(yōu)點(diǎn)和實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-10-10
  • C#異常處理的一些經(jīng)驗(yàn)和技巧

    C#異常處理的一些經(jīng)驗(yàn)和技巧

    本文是異常處理經(jīng)驗(yàn)性的文章,其實(shí)跟C#關(guān)系也不大。比較適合剛剛熟悉異常語(yǔ)法,而缺乏實(shí)戰(zhàn)的讀者。當(dāng)然,經(jīng)驗(yàn)老練的讀者也可指出不足、給予意見(jiàn)、補(bǔ)充說(shuō)明,一起完善文章,分享更多知識(shí)與經(jīng)驗(yàn)
    2014-03-03
  • C#中Serializable序列化實(shí)例詳解

    C#中Serializable序列化實(shí)例詳解

    這篇文章主要介紹了C#中Serializable序列化,以實(shí)例形式詳細(xì)講述了系列化的技術(shù)及各種序列化方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-11-11
  • c#連接excel示例分享

    c#連接excel示例分享

    這篇文章主要介紹了c#連接excel示例,需要注意excel版本的引擎問(wèn)題,需要的朋友可以參考下
    2014-02-02
  • C# 讀取指定路徑配置文件的方法

    C# 讀取指定路徑配置文件的方法

    為了實(shí)現(xiàn)多個(gè)C#程序共用一個(gè)config文件,需要程序讀取指定路徑的config文件。代碼如下:
    2013-03-03
  • C#使用Socket實(shí)現(xiàn)服務(wù)器與多個(gè)客戶端通信(簡(jiǎn)單的聊天系統(tǒng))

    C#使用Socket實(shí)現(xiàn)服務(wù)器與多個(gè)客戶端通信(簡(jiǎn)單的聊天系統(tǒng))

    這篇文章主要介紹了C#使用Socket實(shí)現(xiàn)服務(wù)器與多個(gè)客戶端通信(簡(jiǎn)單的聊天系統(tǒng)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • C#偽彩色處理的具體方法

    C#偽彩色處理的具體方法

    這篇文章主要介紹了C#偽彩色處理的具體方法,需要的朋友可以參考下
    2014-02-02
  • C#12中的新增功能使用總結(jié)

    C#12中的新增功能使用總結(jié)

    這篇文章主要為大家詳細(xì)介紹了C#12中的7個(gè)新增功能的使用,文中的示例代碼講解詳細(xì),對(duì)我們深入學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以了解下
    2023-10-10
  • 在C#中優(yōu)化JPEG壓縮級(jí)別和文件大小方式

    在C#中優(yōu)化JPEG壓縮級(jí)別和文件大小方式

    文章介紹了如何在C#中優(yōu)化JPEG壓縮級(jí)別和文件大小,通過(guò)使用文件菜單加載圖像文件并選擇不同的壓縮級(jí)別,程序?qū)D像保存為臨時(shí)文件并顯示生成的圖像和文件大小,關(guān)鍵方法SaveJpg使用給定的壓縮指數(shù)保存JPG文件,并通過(guò)GetEncoderInfo獲取編碼器信息
    2025-01-01

最新評(píng)論

新乡市| 邹城市| 镇平县| 巩留县| 宜川县| 峨边| 砀山县| 杭州市| 台南市| 河池市| 武宣县| 桃江县| 托克逊县| 沙洋县| 和龙市| 如东县| 莒南县| 镇远县| 镶黄旗| 天镇县| 玛纳斯县| 林西县| 页游| 萝北县| 竹北市| 富锦市| 观塘区| 若尔盖县| 泉州市| 集安市| 喀喇| 镇安县| 洪湖市| 临颍县| 东乡族自治县| 精河县| 灵宝市| 革吉县| 无为县| 宁远县| 博白县|