gpt4 book ai didi

c# - Linq distinct 不调用 Equals 方法

转载 作者:太空狗 更新时间:2023-10-29 22:58:24 26 4
gpt4 key购买 nike

我有以下类(class)

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# - Linq distinct 不调用 Equals 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29470112/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com