ICollection <t>。包含自定义类型</t>

时间:2010-01-27 00:42:20

标签: c# .net collections contains

如果我有(引用 - 这有关系吗?)键入 MyType ,它不会覆盖 Equals 方法,那么在确定时会使用什么启发式方法> ICollection&lt; MyType&gt; 包含类型为?

的给定实例

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

4 个答案:

答案 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();
    }
}