.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))

Но это игнорирует подобный cartproducts, и я, кажется, не знаю то, что это проверяет - идентификатор? или все это?

Заранее спасибо! :)

83
задан David 6 January 2016 в 22:23
поделиться

5 ответов

Вам необходимо реализовать 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;
    }
}
105
ответ дан 24 November 2019 в 08:43
поделиться

Он проверяет, содержится ли конкретный объект в списке.

Возможно, вам лучше использовать метод поиска в списке.

Вот пример

List<CartProduct> lst = new List<CartProduct>();

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

Надеюсь, что это поможет

Вам также стоит взглянуть на LinQ - возможно, излишний для этого, но, тем не менее, полезный инструмент ...

10
ответ дан 24 November 2019 в 08:43
поделиться

По умолчанию ссылочные типы имеют равенство ссылок (т.е. два экземпляра равны только если они являются одним и тем же объектом).

Вам нужно переопределить Object.EqualsObject.GetHashCode для соответствия), чтобы реализовать ваше собственное равенство. (И в этом случае хорошей практикой является реализация оператора равенства, ==)

.
4
ответ дан 24 November 2019 в 08:43
поделиться

Если вы хотите контролировать это, вам необходимо реализовать [интерфейс IEquatable] [1]

[1]: http: // Это Метод определяет равенство с помощью средства сравнения по умолчанию, как определено реализацией объекта метода IEquatable.Equals для T (тип значений в списке).

0
ответ дан 24 November 2019 в 08:43
поделиться

. Если вы используете .NET 3.5 или новее, вы можете использовать методы расширения LINQ для проверки наличия с помощью метода расширения Any :

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

Это проверяет наличие продукта в CartProducts , идентификатор которого совпадает с идентификатором p . Вы можете поместить любое логическое выражение после => , чтобы выполнить проверку.

Это также имеет то преимущество, что работает как с запросами LINQ-to-SQL, так и с запросами в памяти, где содержит - нет.

127
ответ дан 24 November 2019 в 08:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: