中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-09-17 17:07:11 來源:腳本之家 閱讀:214 作者:新田三十三 欄目:編程語言

我們在想對一個可枚舉的對象集合進行去重操作時,一般第一個想到的就是就是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方法內進行比較的是聲明的引用,而不是對象屬性,就和對兩個屬性一模一樣的對象使用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集合內依然有兩個對象。

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

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

而當兩個對象HashCode不相同時, Equals 方法就會被調用,對要比較的對象進行判斷。

由于在上例中list中的兩個引用實際上是兩個不同的對象,因此HashCode必定不相同

所以要觸發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());

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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

岳阳市| 肇东市| 凤阳县| 察隅县| 林芝县| 楚雄市| 芦溪县| 房产| 灌阳县| 孙吴县| 宝鸡市| 新乡市| 卢龙县| 峡江县| 淮滨县| 榆林市| 赞皇县| 福州市| 胶南市| 喜德县| 延长县| 读书| 环江| 海淀区| 红桥区| 三穗县| 织金县| 山东省| 太仆寺旗| 祁连县| 海口市| 西峡县| 北票市| 麦盖提县| 师宗县| 辉南县| 阿坝县| 扎兰屯市| 辉县市| 平凉市| 东乌|