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

デフォルトでは、参照型には参照の等価性があります (つまり、2 つのインスタンスが等しいのは、それらが同じオブジェクトである場合のみです)。

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

于 2010-04-13T11:37:48.497 に答える
-2

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

[1]: http://このメソッドは、T (リスト内の値の型) の IEquatable.Equals メソッドのオブジェクトの実装によって定義されるように、既定の等値比較子を使用して等値を決定します。

于 2010-04-13T11:37:57.600 に答える