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

溫馨提示×

溫馨提示×

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

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

c#項目中什么情況下Linq distinct無法調用Equals

發布時間:2020-12-07 14:29:20 來源:億速云 閱讀:125 作者:Leah 欄目:開發技術

本篇文章為大家展示了c#項目中什么情況下Linq distinct無法調用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();
 }
}

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

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()調用似乎沒有做到這一點.仍然存在彼此相等的對象.

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

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

是什么導致這種情況發生?

示例值:

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

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

我不關心選擇哪個值,因為md5值相同,它們可能是相同的.

您還需要覆蓋Object.Equals,而不僅僅是實現IEquatable.

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

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

它應該工作.

有關詳細信息,請參閱此文章:Implementing IEquatable Properly

編輯:好的,這是基于GetHashCode的最佳實踐的略有不同的實現.

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;
  }
 }
}

你可以驗證它:

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();

What's with those specific numbers in GetHashCode&#63;

補充知識:C#中通過Distinct方法對List集合進行去重

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

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

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

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

經過上述Distinct方法去重處理并重新賦值后,intList集合內部元素為: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個元素依舊是不同的對象,因此在調用Distinct()方法去重后重新賦值,testList依舊不變。

上述內容就是c#項目中什么情況下Linq distinct無法調用Equals,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

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

AI

罗定市| 本溪| 天镇县| 中西区| 平和县| 内江市| 始兴县| 行唐县| 广安市| 黎川县| 丰宁| 安义县| 全椒县| 屏东县| 绥阳县| 金堂县| 东阿县| 绥德县| 东明县| 铜梁县| 邯郸市| 赣榆县| 三门峡市| 沾益县| 专栏| 杭锦后旗| 祁门县| 友谊县| 闸北区| 长子县| 淮北市| 霍邱县| 永年县| 甘德县| 剑河县| 天祝| 曲沃县| 南和县| 原阳县| 蓝田县| 明溪县|