首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >与C#中的对象比较

与C#中的对象比较
EN

Stack Overflow用户
提问于 2014-11-13 20:51:43
回答 2查看 96关注 0票数 0

你好,我是C#的新手,我有一个小问题:当我调用list1.contains(product)方法时,它像java一样吗?我们需要重写相等方法吗?

如果是?就这样做吗?

代码语言:javascript
复制
public partial class product 
{
    public product()
    {
    }

    public int idProduct { get; set; }

    public override bool Equals(object obj)
    {
        if (this == obj)
        {
            return true;
        }
        if (obj == null)
        {
            return false;
        }
        if (this.GetType() != obj.GetType())
        {
            return false;
        }

        product other = (product)obj;
        if (idProduct != other.idProduct)
        {
            return false;
        }
        return true;
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-13 20:55:58

是的,您应该重写等于为类提供相等的语义。默认情况下,引用相等将起作用。

您的相等方法可以工作,但在C#中,我们也可以重写==操作符。因此,在等于方法中使用可能不安全。最好使用ReferenceEquals进行参考比较:

代码语言:javascript
复制
    public override bool Equals(object obj)
    {
        if (ReferenceEquals(obj,null))
        {
            return false;
        }
        if (ReferenceEquals(this,obj))
        {
            return true;
        }
        if (this.GetType() != obj.GetType())
        {
            return false;
        }
        product other = (product)obj;
        if (idProduct != other.idProduct)
        {
            return false;
        }
        return true;
    }
票数 3
EN

Stack Overflow用户

发布于 2014-11-13 21:17:21

除了@driis答复之外,您还可以创建一个新的IEqualityComparer,如:

代码语言:javascript
复制
public sealed class ProductEqualityComparer : IEqualityComparer<Product>
{
    public bool Equals(Product x, Product y)
    {
        if (ReferenceEquals(x, y)) return true;
        if (ReferenceEquals(x, null)) return false;
        if (ReferenceEquals(y, null)) return false;
        if (x.GetType() != y.GetType()) return false;
        return x.idProduct == y.idProduct;
    }

    public int GetHashCode(Product obj)
    {
        return obj.idProduct;
    }
}

然后,您可以将该Comparer传递给Contains,例如:

代码语言:javascript
复制
if (list1.Contains(product, new ProductEqualityComparer()))
{

}

其中list1List<Product>,定义为:

代码语言:javascript
复制
Product product = new Product { idProduct = 1 };
List<Product> list1 = new List<Product>
{
    new Product{idProduct =  1},
    new Product{idProduct = 2}
};

或者您可以从EqualityComparer<T>继承,然后重写EqualsGetHashCode,因为MSDN状态

我们建议您从EqualityComparer<T>类派生,而不是实现IEqualityComparer<T>接口,因为EqualityComparer<T>类使用IEquatable<T>.Equals方法而不是Object.Equals方法测试等式。这与包含、IndexOf、LastIndexOf和Dictionary<TKey, TValue>类及其他泛型集合的Remove方法是一致的。

代码语言:javascript
复制
public sealed class ProductEqualityComparer : EqualityComparer<Product>
{
    public override bool Equals(Product x, Product y)
    {
        if (ReferenceEquals(x, y)) return true;
        if (ReferenceEquals(x, null)) return false;
        if (ReferenceEquals(y, null)) return false;
        if (x.GetType() != y.GetType()) return false;
        return x.idProduct == y.idProduct;
    }

    public override int GetHashCode(Product obj)
    {
        return obj.idProduct;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26918180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档