c# Linq distinct不會(huì)調(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();
}
問(wèn)題是Distinct()調(diào)用似乎沒(méi)有做到這一點(diǎn).仍然存在彼此相等的對(duì)象.
根據(jù)這篇文章:https://msdn.microsoft.com/en-us/library/vstudio/bb348436%28v=vs.100%29.aspx
這就是你應(yīng)該如何做出不同的工作,但它似乎并沒(méi)有在ModInfo對(duì)象上調(diào)用Equals方法.
是什么導(dǎo)致這種情況發(fā)生?
示例值:
modinfo[0]: id=2069, MD5 =0AAEBF5D2937BDF78CB65807C0DC047C
modinfo[1]: id=2208, MD5 = 0AAEBF5D2937BDF78CB65807C0DC047C
我不關(guān)心選擇哪個(gè)值,因?yàn)閙d5值相同,它們可能是相同的.
您還需要覆蓋Object.Equals,而不僅僅是實(shí)現(xiàn)IEquatable.
如果你把它添加到你的班級(jí):
public override bool Equals(object other)
{
ModInfo mod = other as ModInfo;
if (mod != null)
return Equals(mod);
return false;
}
它應(yīng)該工作.
有關(guān)詳細(xì)信息,請(qǐng)參閱此文章: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ǔ)充知識(shí):C#中通過(guò)Distinct方法對(duì)List集合進(jìn)行去重
在C#的List集合對(duì)象中,可以使用Distinct方法來(lái)對(duì)List集合元素進(jìn)行去重,如果list集合內(nèi)部元素為值類型,則Distinct方法根據(jù)值類型是否相等來(lái)判斷去重,如果List集合內(nèi)部元素為引用類型變量,則是判斷相同引用的對(duì)象為相同進(jìn)行List集合元素去重操作。
(1)值類型的List集合對(duì)象intList,內(nèi)部元素為1,1,2,2,3,4,5等這幾個(gè)元素。對(duì)intList對(duì)象進(jìn)行去重可使用下列語(yǔ)句:
List intList= new List() { 1, 1,2,2,3,4,5};
intList= intList.Distinct().ToList();
經(jīng)過(guò)上述Distinct方法去重處理并重新賦值后,intList集合內(nèi)部元素為:1,2,3,4,5。
(2)針對(duì)引用類型的Distinct方法去重,則是判斷List集合中的對(duì)象引用地址是否一致,不一致的話為不同的兩個(gè)對(duì)象,即使2個(gè)對(duì)象的每個(gè)屬性值都一樣的情況下。
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();
上述程序語(yǔ)句中,雖然List集合testList中的第2個(gè)元素和第3個(gè)元素的屬性值完全一樣,但這2個(gè)元素依舊是不同的對(duì)象,因此在調(diào)用Distinct()方法去重后重新賦值,testList依舊不變。
以上這篇c# Linq distinct不會(huì)調(diào)用Equals方法詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
淺析C# 9.0 新特性之 Lambda 棄元參數(shù)
這篇文章主要介紹了C# 9.0 新特性之 Lambda 棄元參數(shù)的的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),想學(xué)習(xí)c#的朋友可以了解下2020-06-06
Unity3D實(shí)現(xiàn)待機(jī)狀態(tài)圖片循環(huán)淡入淡出
這篇文章主要為大家詳細(xì)介紹了Unity3D實(shí)現(xiàn)待機(jī)狀態(tài)圖片循環(huán)淡入淡出,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
C#如何將Access中以時(shí)間段條件查詢的數(shù)據(jù)添加到ListView中
這篇文章主要介紹了C# 將Access中以時(shí)間段條件查詢的數(shù)據(jù)添加到ListView中,需要的朋友可以參考下2017-07-07
C#并發(fā)實(shí)戰(zhàn)記錄之Parallel.ForEach使用
這篇文章主要給大家介紹了關(guān)于C#并發(fā)實(shí)戰(zhàn)記錄之Parallel.ForEach使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
C#?EF?Core可視化工具的使用及EF?Core入門語(yǔ)句操作代碼
EF?Core?可用作對(duì)象關(guān)系映射程序?(O/RM),以便于?.NET?開發(fā)人員能夠使用?.NET?對(duì)象來(lái)處理數(shù)據(jù)庫(kù),這樣就不必經(jīng)常編寫大部分?jǐn)?shù)據(jù)訪問(wèn)代碼了,接下來(lái)通過(guò)本文給大家介紹C#?EF?Core可視化工具的使用及EF?Core入門語(yǔ)句,感興趣的朋友一起看看吧2022-02-02

