Próbuję użyć .Contains()
funkcji na liście obiektów niestandardowych
Oto lista:
List<CartProduct> CartProducts = new List<CartProduct>();
Oraz 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 w koszyku na liście:
if (CartProducts.Contains(p))
Ale ignoruje podobne produkty w koszyku i wydaje mi się, że nie wiem, co sprawdza - identyfikator? czy to wszystko?
Z góry dziękuję! :)
GetHashCode()
?Jeśli używasz .NET 3.5 lub nowszego, możesz użyć metod rozszerzenia LINQ, aby uzyskać sprawdzenie „zawiera” za pomocą
Any
metody rozszerzenia:if(CartProducts.Any(prod => prod.ID == p.ID))
Spowoduje to sprawdzenie, czy istnieje produkt, w ramach
CartProducts
którego identyfikator jest zgodny z identyfikatoremp
.=>
Aby wykonać sprawdzenie, po znaku można umieścić dowolne wyrażenie logiczne .Ma to również tę zaletę, że działa z zapytaniami LINQ-to-SQL, a także z zapytaniami w pamięci, gdzie
Contains
nie.źródło
Sprawdza, czy określony obiekt znajduje się na liście.
Możesz lepiej użyć metody Find na liście.
Oto przykład
List<CartProduct> lst = new List<CartProduct>(); CartProduct objBeer; objBeer = lst.Find(x => (x.Name == "Beer"));
Mam nadzieję, że to pomoże
Powinieneś także spojrzeć na LinQ - być może przesada, ale mimo to przydatne narzędzie ...
źródło
Equals()
metoda została zmieniona z jakiegokolwiek powodu)Domyślnie typy odwołań mają równość odwołań (tj. Dwa wystąpienia są równe tylko wtedy, gdy są tym samym obiektem).
Musisz nadpisać
Object.Equals
(iObject.GetHashCode
dopasować), aby zaimplementować własną równość. (A zatem dobrą praktyką jest wdrożenie==
operatora równości ,,).źródło
CartProduct
obiektów zachowywało się inaczej w różnych miejscach.Contains()
”. Zgadzam się, żeFind()
mogłoby to rozwiązać problem, chociaż sugerowałbym, że posiadanie odpowiedniej metody równości może być bardziej przydatne w wielu innych przypadkach, ponieważ PO nie zauważył, że odniesienia dla dwóch instancji tego samego podmiotu były różne.Musisz utworzyć obiekt ze swojej listy, taki jak:
List<CartProduct> lst = new List<CartProduct>(); CartProduct obj = lst.Find(x => (x.Name == "product name"));
Ten obiekt uzyskuje wyglądaną wartość wyszukując po ich właściwościach: x.nazwa
Następnie możesz użyć metod listy, takich jak Contains lub Remove
if (lst.Contains(obj)) { lst.Remove(obj); }
źródło
Wdrożenie
override Equals()
iGetHashCode()
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(); } }
używany:
if (CartProducts.Contains(p))
źródło
Jeśli chcesz mieć nad tym kontrolę, musisz zaimplementować [interfejs IEquatable] [1]
[1]: http: // Ta metoda określa równość przy użyciu domyślnej funkcji porównującej równość, zgodnie z definicją w implementacji metody IEquatable.Equals obiektu dla T (typ wartości na liście).
źródło