欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c#  Linq distinct不會調(diào)用Equals方法詳解

 更新時間:2020年12月07日 11:21:52   作者:程序園  
這篇文章主要介紹了c# Linq distinct不會調(diào)用Equals方法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

我有以下課程

public class ModInfo : IEquatable<ModInfo>
{
 public int ID { get; set; }
 public string MD5 { get; set; }

 public bool Equals(ModInfo other)
 {
  return other.MD5.Equals(MD5);
 }

 public override int GetHashCode()
 {
  return MD5.GetHashCode();
 }
}

我使用如下方法將一些數(shù)據(jù)加載到該類的列表中:

public void ReloadEverything() {
 var beforeSort = new List<ModInfo>();
 // Bunch of loading from local sqlite database. 
 // not included since it's reload boring to look at
 var modinfo = beforeSort.OrderBy(m => m.ID).AsEnumerable().Distinct().ToList();
}

問題是Distinct()調(diào)用似乎沒有做到這一點(diǎn).仍然存在彼此相等的對象.

根據(jù)這篇文章:https://msdn.microsoft.com/en-us/library/vstudio/bb348436%28v=vs.100%29.aspx

這就是你應(yīng)該如何做出不同的工作,但它似乎并沒有在ModInfo對象上調(diào)用Equals方法.

是什么導(dǎo)致這種情況發(fā)生?

示例值:

modinfo[0]: id=2069, MD5 =0AAEBF5D2937BDF78CB65807C0DC047C

modinfo[1]: id=2208, MD5 = 0AAEBF5D2937BDF78CB65807C0DC047C

我不關(guān)心選擇哪個值,因?yàn)閙d5值相同,它們可能是相同的.

您還需要覆蓋Object.Equals,而不僅僅是實(shí)現(xiàn)IEquatable.

如果你把它添加到你的班級:

public override bool Equals(object other)
{
 ModInfo mod = other as ModInfo;
 if (mod != null)
  return Equals(mod);
 return false;
}

它應(yīng)該工作.

有關(guān)詳細(xì)信息,請參閱此文章:Implementing IEquatable Properly

編輯:好的,這是基于GetHashCode的最佳實(shí)踐的略有不同的實(shí)現(xiàn).

public class ModInfo : IEquatable<ModInfo>
{
 public int ID { get; set; }
 public string MD5 { get; set; }

 public bool Equals(ModInfo other)
 {
  if (other == null) return false;
  return (this.MD5.Equals(other.MD5));
 }

 public override int GetHashCode()
 {
  unchecked
  {
   int hash = 13;
   hash = (hash * 7) + MD5.GetHashCode();
   return hash;
  }
 }

 public override bool Equals(object obj)
 {
  ModInfo other = obj as ModInfo;
  if (other != null)
  {
   return Equals(other);
  }
  else
  {
   return false;
  }
 }
}

你可以驗(yàn)證它:

ModInfo mod1 = new ModInfo {ID = 1, MD5 = "0AAEBF5D2937BDF78CB65807C0DC047C"};
ModInfo mod2 = new ModInfo {ID = 2, MD5 = "0AAEBF5D2937BDF78CB65807C0DC047C"};

// You should get true here
bool areEqual = mod1.Equals(mod2);

List<ModInfo> mods = new List<ModInfo> {mod1, mod2};

// You should get 1 result here
mods = mods.Distinct().ToList();

補(bǔ)充知識:C#中通過Distinct方法對List集合進(jìn)行去重

在C#的List集合對象中,可以使用Distinct方法來對List集合元素進(jìn)行去重,如果list集合內(nèi)部元素為值類型,則Distinct方法根據(jù)值類型是否相等來判斷去重,如果List集合內(nèi)部元素為引用類型變量,則是判斷相同引用的對象為相同進(jìn)行List集合元素去重操作。

(1)值類型的List集合對象intList,內(nèi)部元素為1,1,2,2,3,4,5等這幾個元素。對intList對象進(jìn)行去重可使用下列語句:

List intList= new List() { 1, 1,2,2,3,4,5};

intList= intList.Distinct().ToList();

經(jīng)過上述Distinct方法去重處理并重新賦值后,intList集合內(nèi)部元素為:1,2,3,4,5。

(2)針對引用類型的Distinct方法去重,則是判斷List集合中的對象引用地址是否一致,不一致的話為不同的兩個對象,即使2個對象的每個屬性值都一樣的情況下。

List testList = new List<ConsoleApplication1.TestModel>();
testList.Add(new TestModel()
{
Index=1,
Name=“Index1”
});
testList.Add(new TestModel()
{
Index = 2,
Name = “Index2”
});
testList.Add(new TestModel()
{
Index = 2,
Name = “Index2”
});
testList = testList.Distinct().ToList();

上述程序語句中,雖然List集合testList中的第2個元素和第3個元素的屬性值完全一樣,但這2個元素依舊是不同的對象,因此在調(diào)用Distinct()方法去重后重新賦值,testList依舊不變。

以上這篇c# Linq distinct不會調(diào)用Equals方法詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#委托delegate實(shí)例解析

    C#委托delegate實(shí)例解析

    這篇文章主要介紹了C#委托delegate實(shí)例解析,對C#的委托做了較為深入的剖析,很適合初學(xué)者學(xué)習(xí),需要的朋友可以參考下
    2014-08-08
  • C#連接Excel驅(qū)動與示例代碼分享

    C#連接Excel驅(qū)動與示例代碼分享

    這篇文章主要介紹了C#連接Excel驅(qū)動與示例代碼,需要的朋友可以參考下
    2014-02-02
  • C#遞歸算法尋找數(shù)組中第K大的數(shù)

    C#遞歸算法尋找數(shù)組中第K大的數(shù)

    首先將向量V從中間位置分開,分成左和右,分好后,中間值的索引如果恰恰等于K,就找到了,否則如果中間元素索引大于K,則在左子表中繼續(xù)查找,忽略右子表,如果中間值索引小于K,則在右子表中繼續(xù)查找,如此循環(huán)往復(fù)。
    2016-06-06
  • C#泛型方法在lua中表示的一種設(shè)計詳解

    C#泛型方法在lua中表示的一種設(shè)計詳解

    這篇文章主要給大家介紹了關(guān)于C#泛型方法在lua中表示的一種設(shè)計的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • C#中WPF使用多線程調(diào)用窗體組件的方法

    C#中WPF使用多線程調(diào)用窗體組件的方法

    這篇文章主要介紹了C#中WPF使用多線程調(diào)用窗體組件的方法,涉及C#中多線程的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • 淺談C#中的string駐留池

    淺談C#中的string駐留池

    這篇文章主要介紹了C#中的string駐留池的的相關(guān)資料,文中示例代碼非常細(xì)致,供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • C#完成word文檔打印的方法

    C#完成word文檔打印的方法

    在日常工作中,我們可能常常需要打印各種文件資料,比如word文檔。對于編程員,應(yīng)用程序中文檔的打印是一項(xiàng)非常重要的功能,也一直是一個非常復(fù)雜的工。這篇文章主要介紹了C#完成word文檔打印的方法,需要的朋友可以參考下
    2016-10-10
  • C#?WPF實(shí)現(xiàn)播放音頻文件的示例詳解

    C#?WPF實(shí)現(xiàn)播放音頻文件的示例詳解

    這篇文章主要為大家詳細(xì)介紹了利用C#?WPF實(shí)現(xiàn)播放音頻文件的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • C#使用LINQ查詢操作符實(shí)例代碼(一)

    C#使用LINQ查詢操作符實(shí)例代碼(一)

    這篇文章介紹了C#使用LINQ查詢操作符的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • 淺談c# 浮點(diǎn)數(shù)計算

    淺談c# 浮點(diǎn)數(shù)計算

    本文通過具體的示例給大家演示了下C#中浮點(diǎn)數(shù)運(yùn)算所遇到的問題及解決方法,有需要的小伙伴可以參考下
    2017-09-09

最新評論