如果我有一个不覆盖Equals方法的(参考 - 这有关系吗?)类型MyType ,那么在确定ICollection<MyType>是否包含该类型的给定实例时将使用什么启发式方法?
使用我自己的启发式方法的最佳方法是什么(例如检查Id属性值的相等性)?
如果我有一个不覆盖Equals方法的(参考 - 这有关系吗?)类型MyType ,那么在确定ICollection<MyType>是否包含该类型的给定实例时将使用什么启发式方法?
使用我自己的启发式方法的最佳方法是什么(例如检查Id属性值的相等性)?
因为您的类型没有覆盖 Equals,所以将使用 Equals 的默认实现,即引用相等。因此,如果集合包含该实例,那么 Contains 将为真。
要使用您自己的比较,请实现IEqualityComparer<T>
(例如比较 Id)并将您的比较器的实例传递给 Contains 方法。(这假设您能够使用 LINQ 扩展,因为“本机”ICollection<T>.Contains
方法没有 IEqualityComparer 重载。)
它不是由ICollection<T>
- 不同的实现可以使用不同的方法定义的。来自MSDN:
实现在确定对象相等性的方式上可能有所不同;例如,
List<T>
usesComparer<T>.Default
,而Dictionary<TKey, TValue>
允许用户指定IComparer<T>
用于比较键的实现
在大多数情况下,它只会比较参考资料,但您应该查看 ICollection<T>
您正在使用的特定文档的文档。
AFAIK,将比较引用(内存中的地址)......
如果参考对您来说不够好,那么您可以比较 ID,正如您所提到的。
根据 MSDN:
实现在确定对象相等性的方式上可能有所不同;例如,List<(Of <(T>)>) 使用 Comparer<(Of <(T>)>)..::.Default,而 Dictionary<(Of <(TKey, TValue>)>) 允许用户指定用于比较键的 IComparer<(Of <(T>)>) 实现。
自己做的最好方法是使用需要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();
}
}