.Contains () na liście obiektów klasy niestandardowej

Próbuję użyć funkcji .Contains() na liście obiektów niestandardowych

Oto lista:

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

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

Więc staram się znaleźć podobny produkt na liście:

if (CartProducts.Contains(p))

Ale ignoruje podobne produkty i nie wiem, co sprawdza-identyfikator? albo wszystko?

Z góry dzięki! :)

Author: David, 2010-04-13

5 answers

Musisz zaimplementować IEquatable lub nadpisać Equals() i GetHashCode()

Na przykład:

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;
    }
}
 96
Author: Rowland Shaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-13 11:55:19

Jeśli używasz. NET 3.5 lub nowszego, możesz użyć metod rozszerzenia LINQ, aby uzyskać sprawdzenie "contains" z Any metoda rozszerzenia:

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

To sprawdzi istnienie produktu w CartProducts, który ma ID pasujące do ID p. Możesz umieścić dowolne wyrażenie logiczne po =>, Aby wykonać czek.

Jest to również zaleta pracy dla zapytań LINQ-to-SQL, a także zapytań w pamięci, gdzie Contains nie ma.
 103
Author: Paul Turner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-29 22:30:26

Sprawdza, czy dany obiekt znajduje się na liście.

Być może lepiej będzie użyć metody Znajdź na liście.

Oto przykład

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

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

Hope that helps

Powinieneś również spojrzeć na LinQ-overkill dla tego być może, ale przydatne narzędzie mimo wszystko...

 10
Author: Martin Milan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-13 12:12:09

Domyślnie typy referencji mają równość referencji(tzn. dwie instancje są równe tylko wtedy, gdy są tym samym obiektem).

Musisz nadpisać Object.Equals (i Object.GetHashCode aby dopasować), aby zaimplementować własną równość. (I jest to dobra praktyka, aby wdrożyć równości, ==, operator.)

 5
Author: Richard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-13 11:37:48

Jeśli chcesz mieć nad tym kontrolę, musisz zaimplementować [IEquatable interface] [1]

[1]: http://This Metoda określa równość za pomocą domyślnego porównywania równości, zdefiniowanego przez implementację IEquatable.Jest równa metodzie dla T (typ wartości w liście).

 0
Author: Gerrie Schenck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-13 11:37:57