gpt4 book ai didi

c# - Linq Except 如何比较结果

转载 作者:太空宇宙 更新时间:2023-11-03 23:19:11 25 4
gpt4 key购买 nike

Except如何判断2个值是否相同

我有以下代码

var removes = collection.Except(values, comparer).ToList();
var adds = values.Except( collection, comparer).ToList();
foreach (var item in removes)
{
collection.Remove(item);
}
foreach (var item in adds)
{
collection.Add(item);
}

但是比较器认为相等的项目包含在除外列表中,所以为了查看发生了什么,我在 Equals 函数中放置了一个断点并且它没有被调用,只有 GetHashCode() 函数

那么用什么标准来比较项目,是不是只有哈希值不同才调用相等函数?

编辑:比较类和比较类是

public class Lookup
{
public static readonly IEqualityComparer<Lookup> DefaultComparer = new EqualityComparer();
private class EqualityComparer : IEqualityComparer<Lookup>
{
public bool Equals(Lookup x, Lookup y)
{
if (x == null)
return y == null;
else if (y == null)
return false;
else
return x.ID == y.ID
&& x.Category == y.Category
&& x.DisplayText == y.DisplayText
&& MetaData.CollectionComparer.Equals(x.MetaData, y.MetaData);
}

public int GetHashCode(Lookup obj)
{
var rtn = new { obj.ID, obj.Category, obj.DisplayText, obj.MetaData }.GetHashCode();

return rtn;
}
}
[DataMember]
public int ID { get; set; }
[DataMember]
public LookupType Category { get; set; }
[DataMember]
public string DisplayText { get; set; }
[DataMember]
public MetaData[] MetaData { get; set; }
}

最佳答案

is it only if the hashes are different that it calls the equality function?

是的,就是这样。这是出于性能原因(假设 GetHashCode 实现应始终比 Equals 实现快得多)。

如果两个对象有不同的哈希码,它们肯定不会是相同相等对象,所以没有必要调用Equals。仅当哈希码相同时,才会调用 Equals 以查看它们是否真的相等或只是偶然具有相同的哈希码。

因此您的 GetHashCode 实现应始终确保相等 对象具有相同的哈希码。

由于您的 GetHashCode 实现创建了一个匿名类型的实例并在该实例上调用了 GetHashCode,因此哈希码总是不同的,因此您的所有对象都是不同的从彼此。

关于c# - Linq Except 如何比较结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36041138/

25 4 0
文章推荐: c# - 当 T 是对象的后代时,为什么不能将 Predicate 分配给 Predicate