J'essaye d'utiliser la .Contains()
fonction sur une liste d'objets personnalisés
Voici la liste:
List<CartProduct> CartProducts = new List<CartProduct>();
Et le 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;
}
}
J'essaie donc de trouver un produit similaire dans la liste:
if (CartProducts.Contains(p))
Mais il ignore les produits de panier similaires et je ne semble pas savoir ce qu'il vérifie - l'ID? ou tout ça?
Merci d'avance! :)
GetHashCode()
?Si vous utilisez .NET 3.5 ou une version plus récente, vous pouvez utiliser les méthodes d'extension LINQ pour effectuer une vérification «contient» avec la
Any
méthode d'extension:Cela vérifiera l'existence d'un produit dans
CartProducts
lequel a un ID correspondant à l'ID dep
. Vous pouvez mettre n'importe quelle expression booléenne après le=>
pour effectuer la vérification.Cela a également l'avantage de fonctionner pour les requêtes LINQ-to-SQL ainsi que pour les requêtes en mémoire, alors que ce
Contains
n'est pas le cas.la source
Il vérifie si l'objet spécifique est contenu dans la liste.
Vous feriez peut-être mieux d'utiliser la méthode Find de la liste.
Voici un exemple
J'espère que cela pourra aider
Vous devriez également regarder LinQ - exagéré pour cela peut-être, mais un outil utile néanmoins ...
la source
Equals()
méthode a été modifiée pour une raison quelconque)Par défaut, les types de référence ont une égalité de référence (c'est-à-dire que deux instances ne sont égales que si elles sont le même objet).
Vous devez remplacer
Object.Equals
(etObject.GetHashCode
faire correspondre) pour implémenter votre propre égalité. (Et il est alors recommandé d'implémenter un==
opérateur d' égalité ,,.)la source
CartProduct
objets se comporte différemment à différents endroits.Contains()
". D'accord, celaFind()
pourrait résoudre le problème, bien que je suggère qu'une méthode d'égalité appropriée puisse être plus utile dans de nombreux autres cas, car le PO n'a pas remarqué que les références pour deux instances de la même entité étaient différentes.Vous devez créer un objet à partir de votre liste comme:
Cet objet obtient la valeur recherchée en recherchant ses propriétés: x.name
Ensuite, vous pouvez utiliser des méthodes de liste telles que Contains ou Remove
la source
Mettre en œuvre
override Equals()
etGetHashCode()
utilisé:
la source
Si vous voulez en avoir le contrôle, vous devez implémenter l '[IEquatable interface] [1]
[1]: http: // Cette méthode détermine l'égalité en utilisant le comparateur d'égalité par défaut, tel que défini par l'implémentation de l'objet de la méthode IEquatable.Equals pour T (le type de valeurs dans la liste).
la source