109

我正在尝试在.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;
    }
}

所以我尝试在列表中找到类似的购物车产品:

if (CartProducts.Contains(p))

但它忽略了类似的购物车产品,我似乎不知道它检查什么 - ID?还是全部?

提前致谢!:)

4

7 回答 7

155

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

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

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

这还具有适用于 LINQ-to-SQL 查询以及内存中查询的好处,而内存中的查询Contains则不然。

于 2010-04-13T12:04:21.343 回答
128

您需要实施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;
    }
}
于 2010-04-13T11:38:55.563 回答
14

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

使用列表中的 Find 方法可能会更好。

这是一个例子

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

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

希望有帮助

你还应该看看 LinQ——这可能有点矫枉过正,但仍然是一个有用的工具......

于 2010-04-13T11:39:01.410 回答
4

默认情况下,引用类型具有引用相等性(即两个实例仅在它们是同一个对象时才相等)。

您需要覆盖Object.Equals(并Object.GetHashCode匹配)以实现自己的平等。(然后,实现一个相等 , ==, 运算符是一种很好的做法。)

于 2010-04-13T11:37:48.497 回答
2

您需要从列表中创建一个对象,例如:

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

CartProduct obj = lst.Find(x => (x.Name == "product name"));

该对象通过其属性获取查找值:x.name

然后您可以使用 List 方法,例如 Contains 或 Remove

if (lst.Contains(obj))
{
   lst.Remove(obj);
}
于 2020-05-07T09:00:46.743 回答
0

实施override Equals()GetHashCode()

public class CartProduct
{
    public Int32 ID;
    ...

    public CartProduct(Int32 ID, ...)
    {
        this.ID = ID;
        ...
    }

    public override int GetHashCode()
    {
        return ID;
    }

    public override bool Equals(Object obj)
        {
            if (obj == null || !(obj is CartProduct))
                return false;
            else
                return GetHashCode() == ((CartProduct)obj).GetHashCode();
        }

}

用过的:

if (CartProducts.Contains(p))
于 2019-02-24T10:56:24.667 回答
-2

如果您想对此进行控制,您需要实现 [IEquatable 接口][1]

[1]:http://此方法通过使用默认相等比较器来确定相等性,该比较器由对象对 T(列表中的值的类型)的 IEquatable.Equals 方法的实现定义。

于 2010-04-13T11:37:57.600 回答