你好,我是C#的新手,我有一个小问题:当我调用list1.contains(product)方法时,它像java一样吗?我们需要重写相等方法吗?
如果是?就这样做吗?
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;
}
}发布于 2014-11-13 20:55:58
是的,您应该重写等于为类提供相等的语义。默认情况下,引用相等将起作用。
您的相等方法可以工作,但在C#中,我们也可以重写==操作符。因此,在等于方法中使用可能不安全。最好使用ReferenceEquals进行参考比较:
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;
}发布于 2014-11-13 21:17:21
除了@driis答复之外,您还可以创建一个新的IEqualityComparer,如:
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,例如:
if (list1.Contains(product, new ProductEqualityComparer()))
{
}其中list1是List<Product>,定义为:
Product product = new Product { idProduct = 1 };
List<Product> list1 = new List<Product>
{
new Product{idProduct = 1},
new Product{idProduct = 2}
};或者您可以从EqualityComparer<T>继承,然后重写Equals和GetHashCode,因为MSDN状态
我们建议您从
EqualityComparer<T>类派生,而不是实现IEqualityComparer<T>接口,因为EqualityComparer<T>类使用IEquatable<T>.Equals方法而不是Object.Equals方法测试等式。这与包含、IndexOf、LastIndexOf和Dictionary<TKey, TValue>类及其他泛型集合的Remove方法是一致的。
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;
}
}https://stackoverflow.com/questions/26918180
复制相似问题