.Contains()在自定义类对象的列表上

我正在尝试在自定义对象列表上使用.Contains()函数

这是名单:

 List<CartProduct> CartProducts = new List<CartProduct>(); 

CartProduct

 public class CartProduct { public Int32 ID; public String Name; public Int32 Number; public Decimal CurrentPrice; /// <summary> /// /// </summary> /// <param name="ID">The ID of the product</param> /// <param name="Name">The name of the product</param> /// <param name="Number">The total number of that product</param> /// <param name="CurrentPrice">The currentprice for the product (1 piece)</param> public CartProduct(Int32 ID, String Name, Int32 Number, Decimal CurrentPrice) { this.ID = ID; this.Name = Name; this.Number = Number; this.CurrentPrice = CurrentPrice; } public String ToString() { return Name; } } 

所以我尝试在列表中find类似的产品:

 if (CartProducts.Contains(p)) 

但它忽略了类似的cartproducts,我似乎不知道它是什么检查 – 身份证? 还是全部?

提前致谢! 🙂

您需要实现IEquatable或覆盖Equals()GetHashCode()

例如:

 public class CartProduct : IEquatable<CartProduct> { public Int32 ID; public String Name; public Int32 Number; public Decimal CurrentPrice; public CartProduct(Int32 ID, String Name, Int32 Number, Decimal CurrentPrice) { this.ID = ID; this.Name = Name; this.Number = Number; this.CurrentPrice = CurrentPrice; } public String ToString() { return Name; } public bool Equals( CartProduct other ) { // Would still want to check for null etc. first. return this.ID == other.ID && this.Name == other.Name && this.Number == other.Number && this.CurrentPrice == other.CurrentPrice; } } 

如果您使用的是.NET 3.5或更新的版本,则可以使用LINQ扩展方法通过Any扩展方法实现“包含”检查:

 if(CartProducts.Any(prod => prod.ID == p.ID)) 

这将检查CartProducts中是否存在具有与p的ID相匹配的ID的产品。 您可以在=>之后放置任何布尔expression式来执行检查。

这也有利于LINQ到SQL查询以及内存查询,其中Contains没有。

它检查特定对象是否包含在列表中。

您可能会更好地使用列表上的查找方法。

这是一个例子

 List<CartProduct> lst = new List<CartProduct>(); CartProduct objBeer; objBeer = lst.Find(x => (x.Name == "Beer")); 

希望有所帮助

你也应该看看LinQ – 这可能是过度的,但是一个有用的工具,但…

默认情况下,引用types具有引用相等性(即,如果两个实例是相同的对象,则两个实例相等)。

你需要重写Object.Equals (和Object.GetHashCode匹配)来实现你自己的平等。 (这是一个很好的实践,实现一个平等, == ,运营商。)

如果你想控制这个,你需要实现[IEquatable接口] [1]

[1]: http://这个方法通过使用默认的相等比较器来确定相等性,正如T对象的IEquatable.Equals方法的实现(列表中值的types)所定义的那样。