ICollection 。包含自定义类型

如果我有一个(引用 – 它有关系吗?)类型MyType ,它不会覆盖Equals方法,在确定ICollection 是否包含给定的类型实例时将使用什么启发式?

使用我自己的启发式方法的最佳方法是什么(例如,检查Id属性值是否相等)?

因为您的类型不会覆盖Equals,所以将使用Equals的默认实现,即引用相等。 因此,如果集合包含该实例,则Contains将为true。

要使用您自己的比较,请实现IEqualityComparer (例如,比较ID)并将比较器的实例传递给Contains方法。 (这假设您可以使用LINQ扩展,因为“本机” ICollection.Contains方法没有IEqualityComparer重载。)

它不是由ICollection定义的 – 不同的实现可以使用不同的方法。 来自MSDN :

实现可以在决定对象相等性方面有所不同; 例如, List使用Comparer.Default ,而Dictionary允许用户指定用于比较键的IComparer实现

在大多数情况下,它只会比较引用,但您应该查看您正在使用的特定ICollection的文档。

AFAIK,参考(内存中的地址)将被比较……

如果参考对您不够好,那么您可以比较ID,如您所述。

根据MSDN:

实现可以在决定对象相等性方面有所不同; 例如,List <(Of <(T>)>)使用Comparer <(Of <(T>)>).. ::。Default,而Dictionary <(Of <(TKey,TValue>)>)允许用户指定用于比较键的IComparer <(Of <(T>)>)实现。

自己做的最好方法是使用带有IEqualityComparer的重载

 public class MyComparer : IEqualityComparer { public bool Equals(MyType x, MyType y) { return x.Id == y.Id; } public int GetHashCode(MyType obj) { return obj.Id.GetHashCode(); } }