.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! :)
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;
}
}
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.
Contains
nie ma.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...
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.)
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).
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