Я пытаюсь использовать .Contains()
функция в списке пользовательских объектов
Это - список:
List<CartProduct> CartProducts = new List<CartProduct>();
И 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;
}
}
Таким образом, я пытаюсь найти подобный cartproduct в рамках списка:
if (CartProducts.Contains(p))
Но это игнорирует подобный cartproducts, и я, кажется, не знаю то, что это проверяет - идентификатор? или все это?
Заранее спасибо! :)
Вам необходимо реализовать IEquatable
или переопределить Equals ()
и GetHashCode ()
Например:
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;
}
}
Он проверяет, содержится ли конкретный объект в списке.
Возможно, вам лучше использовать метод поиска в списке.
Вот пример
List<CartProduct> lst = new List<CartProduct>();
CartProduct objBeer;
objBeer = lst.Find(x => (x.Name == "Beer"));
Надеюсь, что это поможет
Вам также стоит взглянуть на LinQ - возможно, излишний для этого, но, тем не менее, полезный инструмент ...
По умолчанию ссылочные типы имеют равенство ссылок (т.е. два экземпляра равны только если они являются одним и тем же объектом).
Вам нужно переопределить Object.Equals
(и Object.GetHashCode
для соответствия), чтобы реализовать ваше собственное равенство. (И в этом случае хорошей практикой является реализация оператора равенства, ==
)
Если вы хотите контролировать это, вам необходимо реализовать [интерфейс IEquatable] [1]
[1]: http: // Это Метод определяет равенство с помощью средства сравнения по умолчанию, как определено реализацией объекта метода IEquatable.Equals для T (тип значений в списке).
. Если вы используете .NET 3.5 или новее, вы можете использовать методы расширения LINQ для проверки наличия с помощью метода расширения Any
:
if(CartProducts.Any(prod => prod.ID == p.ID))
Это проверяет наличие продукта в CartProducts
, идентификатор которого совпадает с идентификатором p
. Вы можете поместить любое логическое выражение после =>
, чтобы выполнить проверку.
Это также имеет то преимущество, что работает как с запросами LINQ-to-SQL, так и с запросами в памяти, где содержит
- нет.