9

如果我有一个不覆盖Equals方法的(参考 - 这有关系吗?)类型MyType ,那么在确定ICollection<MyType>是否包含该类型的给定实例时将使用什么启发式方法?

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

4

4 回答 4

9

因为您的类型没有覆盖 Equals,所以将使用 Equals 的默认实现,即引用相等。因此,如果集合包含该实例,那么 Contains 将为真。

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

于 2010-01-27T00:49:38.380 回答
1

它不是由ICollection<T>- 不同的实现可以使用不同的方法定义的。来自MSDN

实现在确定对象相等性的方式上可能有所不同;例如,List<T>uses Comparer<T>.Default,而Dictionary<TKey, TValue>允许用户指定IComparer<T> 用于比较键的实现

在大多数情况下,它只会比较参考资料,但您应该查看 ICollection<T>您正在使用的特定文档的文档。

于 2010-01-27T00:49:46.443 回答
0

AFAIK,将比较引用(内存中的地址)......

如果参考对您来说不够好,那么您可以比较 ID,正如您所提到的。

于 2010-01-27T00:50:57.073 回答
0

根据 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();
    }
}
于 2010-01-27T00:51:32.773 回答