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

C# Distinct和重寫IEqualityComparer時要知道的二三事

 更新時間:2019年06月06日 10:45:55   作者:新田三十三  
這篇文章主要給大家介紹了關(guān)于C# Distinct和重寫IEqualityComparer時要知道的二三事,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

我們在想對一個可枚舉的對象集合進行去重操作時,一般第一個想到的就是就是Linq的Distinct方法。

先定義一個類,然后使用Distinct方法去重

class Man
    {
      public int Age { get; set; }
      public string Name { get; set; }
      public string Adress { get; set; }
      public decimal Weight { get; set; }
      public decimal Height { get; set; }
    }
List<Man> list = new List<Man>()
      { 
      new Man(){Age=21,Name="Adam",Adress="Shenzhen",Weight=60,Height=170},
      new Man(){Age=21,Name="Adam",Adress="Shenzhen",Weight=60,Height=170}
      };
      var distinct = list.Distinct();

然而去重得到的distinct集合的Count依然為二,集合里依然存在兩個Adam。

實際上,Distinct方法內(nèi)進行比較的是聲明的引用,而不是對象屬性,就和對兩個屬性一模一樣的對象使用Equals()方法得到的是False一樣。

因此我們對對象集合使用Distinct方法時要使用重載Distinct<TSource>(this IEnumerable<TSource> source, IEqualityComparer<TSource> comparer);

要使用這個方法,我們得重寫IEqualityComparer接口,再使用Distinct方法:

public class ManComparer : IEqualityComparer<Man>
    {
      public bool Equals(Man x, Man y)
      {
        return x.Age == y.Age
          && x.Name == y.Name
          && x.Adress == y.Adress
          && x.Weight == y.Weight
          && x.Height == y.Height;
      }

      public int GetHashCode(Man obj)
      {
        return obj.GetHashCode();
      }
    }

 var distinct = list.Distinct(new ManComparer());

然而,再一次,distinct集合內(nèi)依然有兩個對象。

實際上,由于直接獲取對象的HashCode,用HashCode進行比較的速度比 Equals 方法更快,

因此IEqualityComparer內(nèi)部會在使用 Equals 前先使用 GetHashCode 方法,在兩個對象的HashCode都相同時即刻判斷對象相等。

而當(dāng)兩個對象HashCode不相同時, Equals 方法就會被調(diào)用,對要比較的對象進行判斷。

由于在上例中l(wèi)ist中的兩個引用實際上是兩個不同的對象,因此HashCode必定不相同

所以要觸發(fā)Equlas方法,我們需要改 GetHashCode ,讓它返回相同的常量

public class ManComparerNew : IEqualityComparer<Man>
    {
      public bool Equals(Man x, Man y)
      {
        return x.Age == y.Age
          && x.Name == y.Name
          && x.Adress == y.Adress
          && x.Weight == y.Weight
          && x.Height == y.Height;
      }

      public int GetHashCode(Man obj)
      {
        return 1;
      }
    }

var distinct = list.Distinct(new ManComparerNew());

現(xiàn)在distinct集合中就只有一個Man對象了,成功實現(xiàn)了去重。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • C#算法之羅馬數(shù)字轉(zhuǎn)整數(shù)

    C#算法之羅馬數(shù)字轉(zhuǎn)整數(shù)

    本文詳細(xì)講解了C#算法之羅馬數(shù)字轉(zhuǎn)整數(shù),文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • 在C#中如何獲取程序的命令行參數(shù)

    在C#中如何獲取程序的命令行參數(shù)

    本文介紹了在C#中獲取程序命令行參數(shù)的幾種方法,包括重寫Main方法和使用Environment.GetCommandLineArgs方法,還討論了如何在不同的環(huán)境中設(shè)置命令行參數(shù),如IDE、命令提示符、拖放和發(fā)送到菜單,文章提供了一個在目錄層次結(jié)構(gòu)中搜索文件的示例程序
    2025-01-01
  • C#使用FileStream對象讀寫文件

    C#使用FileStream對象讀寫文件

    這篇文章主要為大家詳細(xì)介紹了C#使用FileStream對象讀寫文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • C#開發(fā)簡易winform計算器程序

    C#開發(fā)簡易winform計算器程序

    這篇文章主要為大家詳細(xì)介紹了C#開發(fā)簡易winform計算器程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • C#中通過反射將枚舉元素加載到ComboBo的實現(xiàn)方法

    C#中通過反射將枚舉元素加載到ComboBo的實現(xiàn)方法

    本文主要介紹了C#中通過反射將枚舉元素加載到ComboBo的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C#學(xué)習(xí)筆記整理_深入剖析構(gòu)造函數(shù)、析構(gòu)函數(shù)

    C#學(xué)習(xí)筆記整理_深入剖析構(gòu)造函數(shù)、析構(gòu)函數(shù)

    下面小編就為大家?guī)硪黄狢#學(xué)習(xí)筆記整理_深入剖析構(gòu)造函數(shù)、析構(gòu)函數(shù)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • C#多線程TPL模式下使用HttpClient

    C#多線程TPL模式下使用HttpClient

    這篇文章介紹了C#多線程TPL模式下使用HttpClient的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • c#實現(xiàn)用SQL池,多線程定時批量執(zhí)行SQL語句的方法

    c#實現(xiàn)用SQL池,多線程定時批量執(zhí)行SQL語句的方法

    構(gòu)建SQL池,分離業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層,讓業(yè)務(wù)邏輯層從低效的數(shù)據(jù)庫操作解脫,以提高系統(tǒng)整體性能
    2013-10-10
  • C#操作本地文件及保存文件到數(shù)據(jù)庫的基本方法總結(jié)

    C#操作本地文件及保存文件到數(shù)據(jù)庫的基本方法總結(jié)

    C#使用System.IO中的文件操作方法在Windows系統(tǒng)中處理本地文件相當(dāng)順手,這里我們還總結(jié)了在Oracle中保存文件的方法,嗯,接下來就來看看整理的C#操作本地文件及保存文件到數(shù)據(jù)庫的基本方法總結(jié)
    2016-05-05
  • C#使用iTextSharp從PDF文檔獲取內(nèi)容的方法

    C#使用iTextSharp從PDF文檔獲取內(nèi)容的方法

    這篇文章主要介紹了C#使用iTextSharp從PDF文檔獲取內(nèi)容的方法,涉及C#基于iTextSharp操作pdf文件的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06

最新評論

昌黎县| 西昌市| 工布江达县| 大竹县| 营口市| 陇西县| 乌恰县| 通河县| 胶南市| 防城港市| 客服| 图片| 共和县| 苏尼特右旗| 大姚县| 元氏县| 区。| 长寿区| 柳州市| 武宁县| 鄂州市| 晋江市| 康保县| 惠东县| 北宁市| 乡城县| 澳门| 临漳县| 兴仁县| 霍邱县| 奈曼旗| 隆昌县| 锡林浩特市| 岑巩县| 黑山县| 龙口市| 江口县| 望都县| 呼玛县| 方城县| 雷州市|