.Contains () in un elenco di oggetti di class personalizzati

Sto cercando di utilizzare la funzione .Contains() in un elenco di oggetti personalizzati

Questa è la lista:

 List CartProducts = new List(); 

E il CartProduct :

 public class CartProduct { public Int32 ID; public String Name; public Int32 Number; public Decimal CurrentPrice; ///  /// ///  /// The ID of the product /// The name of the product /// The total number of that product /// The currentprice for the product (1 piece) 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; } } 

Quindi provo a trovare un cartproduct simile nell’elenco:

 if (CartProducts.Contains(p)) 

Ma ignora cartoprodotti simili e non sembro sapere cosa controlla – l’ID? o tutto?

Grazie in anticipo! 🙂

È necessario implementare IEquatable o eseguire l’override di Equals() e GetHashCode()

Per esempio:

 public class CartProduct : IEquatable { 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; } } 

Se si utilizza .NET 3.5 o versione successiva, è ansible utilizzare i metodi di estensione LINQ per ottenere un controllo “contiene” con il metodo Any estensione:

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

Ciò verificherà l’esistenza di un prodotto all’interno di CartProducts che ha un ID corrispondente all’ID di p . Puoi mettere qualsiasi espressione booleana dopo => per eseguire il controllo.

Questo ha anche il vantaggio di lavorare per le query LINQ-to-SQL e per le query in memoria, dove Contains no.

Controlla se l’object specifico è contenuto nell’elenco.

Potrebbe essere meglio utilizzare il metodo Trova nell’elenco.

Ecco un esempio

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

Spero possa aiutare

Dovresti anche dare un’occhiata a LinQ – forse questo è eccessivo, ma uno strumento utile comunque …

Per default i tipi di riferimento hanno uguaglianza di riferimento (cioè due istanze sono uguali solo se sono lo stesso object).

Devi eseguire l’override di Object.Equals (e Object.GetHashCode per Object.GetHashCode corrispondere) per implementare la tua uguaglianza. (Ed è quindi buona pratica implementare un’eguaglianza, == , operatore.)

Se vuoi avere il controllo su questo è necessario implementare l’interfaccia [IEquatable] [1]

[1]: http: // Questo metodo determina l’uguaglianza utilizzando il confronto di uguaglianza predefinito, come definito dall’implementazione dell’object del metodo IEquatable.Equals per T (il tipo di valori nell’elenco).