Estoy tratando de usar la .Contains()
función en una lista de objetos personalizados.
Esta es la lista:
List<CartProduct> CartProducts = new List<CartProduct>();
Y el 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;
}
}
Así que trato de encontrar un producto de carrito similar dentro de la lista:
if (CartProducts.Contains(p))
Pero ignora productos de carro similares y no parece saber qué verifica: ¿la identificación? o todo eso?
¡Gracias por adelantado! :)
GetHashCode()
?Si está usando .NET 3.5 o más reciente, puede usar los métodos de extensión LINQ para lograr una verificación de "contiene" con el
Any
método de extensión:Esto verificará la existencia de un producto dentro del
CartProducts
cual tenga un ID que coincida con el ID dep
. Puede poner cualquier expresión booleana después de la=>
para realizar la comprobación.Esto también tiene la ventaja de funcionar para consultas LINQ-to-SQL, así como consultas en memoria, donde
Contains
no lo hace.fuente
Comprueba si el objeto específico está incluido en la lista.
Es posible que sea mejor utilizar el método Buscar en la lista.
Aquí hay un ejemplo
Espero que ayude
También debería mirar LinQ - exagerado para esto quizás, pero una herramienta útil no obstante ...
fuente
Equals()
método se cambia por cualquier motivo)Por defecto, los tipos de referencia tienen igualdad de referencia (es decir, dos instancias solo son iguales si son el mismo objeto).
Debe anular
Object.Equals
(yObject.GetHashCode
hacer coincidir) para implementar su propia igualdad. (Y es una buena práctica implementar un==
operador de igualdad ,,).fuente
CartProduct
objetos se comporte de manera diferente en diferentes lugares.Contains()
".Find()
Estoy de acuerdo en que podría resolver el problema, aunque sugeriría que tener un método igual adecuado puede ser más útil en muchos otros casos, ya que el OP no detectó que las referencias para dos instancias de la misma entidad eran diferentes.Necesita crear un objeto de su lista como:
Ese objeto obtiene el valor buscado buscando por sus propiedades: x.name
Luego puede usar métodos de lista como Contiene o Eliminar
fuente
Implementar
override Equals()
yGetHashCode()
usado:
fuente
Si desea tener control sobre esto, debe implementar la [interfaz IEquatable] [1]
[1]: http: // Este método determina la igualdad utilizando el comparador de igualdad predeterminado, según lo definido por la implementación del objeto del método IEquatable.Equals para T (el tipo de valores en la lista).
fuente