如果我有(引用 - 这有关系吗?)键入 MyType ,它不会覆盖 Equals 方法,那么在确定时会使用什么启发式方法> ICollection< MyType> 包含类型为?
的给定实例使用我自己的启发式方法的最佳方式是什么(例如检查 Id 属性值是否相等)?
答案 0 :(得分:8)
因为您的类型不会覆盖Equals,所以将使用Equals的默认实现,即引用相等。因此,如果集合包含非常实例。
,则包含将为true要使用您自己的比较,请实现IEqualityComparer<T>
(例如,比较ID)并将比较器的实例传递给Contains方法。 (这假设您可以使用LINQ扩展,因为“本机”ICollection<T>.Contains
方法没有IEqualityComparer重载。)
答案 1 :(得分:1)
它不是由ICollection<T>
定义的 - 不同的实现可以使用不同的方法。来自MSDN:
实施方式可能有所不同 确定对象的相等性;对于 例如,
List<T>
使用Comparer<T>.Default
, 而Dictionary<TKey, TValue>
允许用户指定IComparer<T>
用于比较的实现 键
在大多数情况下,它只会比较引用,但您应该查看您正在使用的特定ICollection<T>
的文档。
答案 2 :(得分:0)
AFAIK,将比较参考(内存中的地址)......
如果参考对您不够好,那么您可以比较ID,正如您所提到的那样。
答案 3 :(得分:0)
根据MSDN:
实施方式可能有所不同 确定对象的相等性;对于 例如,List&lt;(Of&lt;(T&gt;)&gt;)使用 Comparer&lt;(Of&lt;(T&gt;)&gt;).. ::。默认值, 而词典&lt;(Of&lt;(TKey, TValue&gt;)&gt;)允许用户指定 IComparer&lt;(Of&lt;(T&gt;)&gt;) 用于比较的实现 密钥。
自行完成此操作的最佳方法是使用带有IEqualityComparer<T>
public class MyComparer : IEqualityComparer<MyType>
{
public bool Equals(MyType x, MyType y)
{
return x.Id == y.Id;
}
public int GetHashCode(MyType obj)
{
return obj.Id.GetHashCode();
}
}