C# i收集<;T>;。包含在自定义类型上

C# i收集<;T>;。包含在自定义类型上,c#,.net,collections,contains,C#,.net,Collections,Contains,如果我有一个不覆盖Equals方法的(reference-这有关系吗?)类型MyType,那么在确定ICollection是否包含该类型的给定实例时,将使用什么启发式方法 使用我自己的启发法(例如,检查Id属性值是否相等)的最佳方法是什么?由于您的类型不重写Equals,因此将使用Equals的默认实现,即引用equality。因此,如果集合包含该实例,则Contains将为真 要使用自己的比较,请实现IEqualityComparer(例如,比较ID),并将比较器的实例传递到Contains方

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


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

由于您的类型不重写Equals,因此将使用Equals的默认实现,即引用equality。因此,如果集合包含该实例,则Contains将为真


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

它不是由
ICollection
定义的-不同的实现可以使用不同的方法。发件人:

实现方式可能有所不同 确定对象的平等性;对于 例如,
List
使用
比较器。默认值
, 而
字典
允许用户指定
i比较程序
用于比较的实现 钥匙

在大多数情况下,它只会比较引用,但是您应该检查文档中您正在使用的特定的
i集合。

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

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

根据MSDN:

实现方式可能有所不同 确定对象的平等性;对于 示例(列表)使用 比较器):。默认值, 而字典)允许用户指定 (国际比较公司) 用于比较的实现 钥匙

自行完成此操作的最佳方法是使用重载,该重载需要一个
IEqualityComparer

公共类MyComparer:IEqualityComparer
{
公共布尔等于(MyType x,MyType y)
{
返回x.Id==y.Id;
}
public int GetHashCode(MyType obj)
{
返回obj.Id.GetHashCode();
}
}

出于兴趣,值类型被同等对待,为什么不简单地重写equals方法呢?如果值类型的所有字段都相等,则认为它们是相等的。当然,您可以像重写引用类型一样重写值类型上的等于,也可以像重写引用类型一样为值类型编写自定义IEqualityComparer。您使用的是什么特定集合?System.Collections.ObjectModel.collection
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();
    }
}