亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C# Distinct和重寫IEqualityComparer時(shí)要知道的二三事

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

我們在想對(duì)一個(gè)可枚舉的對(duì)象集合進(jìn)行去重操作時(shí),一般第一個(gè)想到的就是就是Linq的Distinct方法。

先定義一個(gè)類,然后使用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依然為二,集合里依然存在兩個(gè)Adam。

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

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

要使用這個(gè)方法,我們得重寫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)依然有兩個(gè)對(duì)象。

實(shí)際上,由于直接獲取對(duì)象的HashCode,用HashCode進(jìn)行比較的速度比 Equals 方法更快,

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

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

由于在上例中l(wèi)ist中的兩個(gè)引用實(shí)際上是兩個(gè)不同的對(duì)象,因此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集合中就只有一個(gè)Man對(duì)象了,成功實(shí)現(xiàn)了去重。

總結(jié)

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

相關(guān)文章

最新評(píng)論