Я пытаюсь использовать .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;
}
}
Поэтому я пытаюсь найти похожий товар в тележке в списке:
if (CartProducts.Contains(p))
Но он игнорирует похожие товары на тележке, и я, кажется, не знаю, что он проверяет - идентификатор? или все это?
Заранее спасибо! :)
GetHashCode()
?Если вы используете .NET 3.5 или новее, вы можете использовать методы расширения LINQ для проверки «содержит» с помощью
Any
метода расширения:if(CartProducts.Any(prod => prod.ID == p.ID))
Это проверит наличие продукта, в
CartProducts
котором есть идентификатор, соответствующий идентификаторуp
. Вы можете поместить любое логическое выражение после,=>
чтобы выполнить проверку.Это также дает преимущество работы с запросами LINQ-to-SQL, а также с запросами в памяти, где
Contains
нет.источник
Он проверяет, содержится ли конкретный объект в списке.
Возможно, вам лучше использовать метод поиска в списке.
Вот пример
List<CartProduct> lst = new List<CartProduct>(); CartProduct objBeer; objBeer = lst.Find(x => (x.Name == "Beer"));
надеюсь, это поможет
Вам также стоит взглянуть на LinQ - возможно, излишний, но, тем не менее, полезный инструмент ...
источник
Equals()
метод был изменен по какой-либо причине)По умолчанию ссылочные типы имеют ссылочное равенство (т.е. два экземпляра равны, только если они являются одним и тем же объектом).
Вам нужно переопределить
Object.Equals
(иObject.GetHashCode
сопоставить), чтобы реализовать собственное равенство. (И тогда рекомендуется реализовать оператор равенства==
,,.)источник
CartProduct
объектов в разных местах велось по-разному.Contains()
». Согласитесь, что этоFind()
могло бы решить проблему, хотя я бы посоветовал иметь подходящий метод equals может быть более полезным во множестве других случаев, поскольку OP не обнаружил, что ссылки для двух экземпляров одной и той же сущности были разными.Вам нужно создать объект из вашего списка, например:
List<CartProduct> lst = new List<CartProduct>(); CartProduct obj = lst.Find(x => (x.Name == "product name"));
Этот объект получает искомое значение при поиске по их свойствам: x.name
Затем вы можете использовать методы списка, такие как Contains или Remove
if (lst.Contains(obj)) { lst.Remove(obj); }
источник
Реализовать
override Equals()
иGetHashCode()
public class CartProduct { public Int32 ID; ... public CartProduct(Int32 ID, ...) { this.ID = ID; ... } public override int GetHashCode() { return ID; } public override bool Equals(Object obj) { if (obj == null || !(obj is CartProduct)) return false; else return GetHashCode() == ((CartProduct)obj).GetHashCode(); } }
используемый:
if (CartProducts.Contains(p))
источник
Если вы хотите контролировать это, вам необходимо реализовать [интерфейс IEquatable] [1]
[1]: http: // Этот метод определяет равенство с помощью компаратора равенства по умолчанию, как это определено реализацией объекта метода IEquatable.Equals для T (тип значений в списке).
источник