您好,登錄后才能下訂單哦!
本篇文章為大家展示了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?
補充知識: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,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。