web-dev-qa-db-ja.com

.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;
    }
}

だから私はリスト内で同様のcartproductを見つけようとします:

if (CartProducts.Contains(p))

しかし、それは同様のカート製品を無視し、私はそれがチェックするものを知らないようです-ID?それともすべて?

前もって感謝します! :)

81
Jan Johansen

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;
    }
}
105
Rowland Shaw

.NET 3.5以降を使用している場合は、LINQ拡張メソッドを使用して、 Any 拡張メソッドで「含む」チェックを実現できます。

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

これは、CartProductsのIDと一致するIDを持つp内の製品の存在を確認します。 =>の後に任意のブール式を配置して、チェックを実行できます。

これには、Containsが使用できないインメモリクエリだけでなく、LINQ-to-SQLクエリでも機能するという利点があります。

125
Paul Turner

特定のオブジェクトがリストに含まれているかどうかを確認します。

リストのFindメソッドを使用した方がよい場合があります。

ここに例があります

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

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

役立つことを願っています

また、LinQを見てください-これは多すぎるかもしれませんが、それでも便利なツールです...

10
Martin Milan

デフォルトでは、参照タイプは参照が同等です(つまり、2つのインスタンスは、同じオブジェクトである場合にのみ等しくなります)。

独自の平等を実装するには、Object.Equals(および一致するObject.GetHashCode)をオーバーライドする必要があります。 (そして、等式==、演算子を実装することをお勧めします。)

4
Richard

これを制御したい場合は、[IEquatableインターフェイス] [1]を実装する必要があります

[1]: http:// This メソッドは、TのIEquatable.Equalsメソッドのオブジェクトの実装(リスト内の値のタイプ)で定義されているデフォルトの等値比較子を使用して、等値を決定します。

0
Gerrie Schenck

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))
0
A. Morel