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