except 如何判断两个值是否相同
我有以下代码
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);
}
然而,比较器认为相等的项目包含在 except 列表中,因此为了查看发生了什么,我在 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; }
}
难道只有当哈希值不同时才会调用相等函数吗?
是的,就是这样。这是出于性能原因(假设GetHashCode
实施应该总是比Equals
执行)。
如果两个对象有不同的哈希码,它们肯定不会是same or equal对象,所以不需要调用Equals
。只要哈希码相同,Equals
被调用以查看它们是否真的相等或只是偶然具有相同的哈希码。
So your GetHashCode
实施应始终确保equal对象具有相同的哈希码。
自从您实施以来GetHashCode
创建匿名类型的实例并调用GetHashCode
在这种情况下,哈希码将始终不同,因此所有对象都彼此不同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)