Как проверить, содержит ли arraylist объект - PullRequest
0 голосов
/ 27 августа 2018

Я пытаюсь, чтобы моя корзина покупок распознала, был ли товар уже добавлен в корзину, и затем обновляю количество, чтобы сделать его еще одним, однако оно просто продолжает иметь утверждение как ложное.

Вот мой обработчик загрузки страницы, где он создает новый продукт из деталей, отправленных в строке запроса.

Private Sub ShoppingCartPage_Load(sender As Object, e As EventArgs) Handles Me.Load
    If Not (IsPostBack) Then
        If Not (Request.QueryString.ToString().Length.Equals(0)) Then
            Dim newProduct As Product = New Product(Request.QueryString("ProductCode"), Request.QueryString("ProductName"), Request.QueryString("Category"), Val(Request.QueryString("Price")), Request.QueryString("Description"))

            If Session("shoppingCartSession") Is Nothing Then
                shoppingCart = New ArrayList()
                shoppingCart.Add(newProduct)
                Session("shoppingCartSession") = shoppingCart
            ElseIf (shoppingCart.Contains(newProduct.itemID)) Then
                For Each item As Product In shoppingCart
                    If item.Equals(Request.QueryString("ProductCode")) Then
                        item.updateQuantity()
                    End If
                Next

            Else
                shoppingCart = CType(Session("shoppingCartSession"), ArrayList)
                shoppingCart.Add(newProduct)
                Session.Add("shoppingCartSession", shoppingCart)
            End If
        End If
        shoppingCart = CType(Session("shoppingCartSession"), ArrayList)
        createShoppingCartTable()
    End If

End Sub

1 Ответ

0 голосов
/ 27 августа 2018

Здесь есть ряд проблем.Во-первых, если вы добавляете к своему ArrayList вот так:

shoppingCart.Add(newProduct)

, тогда вы добавляете Product объектов.В таком случае, почему вы ожидаете, что это будет полезно:

If (shoppingCart.Contains(newProduct.itemID)) Then

newProduct.itemID предположительно Integer или тому подобное, поэтому, конечно, коллекция не содержит его.Он не содержит значений Integer, поскольку содержит объекты Product.Вам необходимо проверить, содержит ли он объект Product с этим itemID, а не содержит ли он непосредственно itemID.Я заменил бы все это:

If Session("shoppingCartSession") Is Nothing Then
    shoppingCart = New ArrayList()
    shoppingCart.Add(newProduct)
    Session("shoppingCartSession") = shoppingCart
ElseIf (shoppingCart.Contains(newProduct.itemID)) Then
    For Each item As Product In shoppingCart
        If item.Equals(Request.QueryString("ProductCode")) Then
            item.updateQuantity()
        End If
    Next

Else
    shoppingCart = CType(Session("shoppingCartSession"), ArrayList)
    shoppingCart.Add(newProduct)
    Session.Add("shoppingCartSession", shoppingCart)
End If

на это:

shoppingCart = TryCast(Session("shoppingCartSession"), ArrayList)

If shoppingCart Is Nothing Then
    shoppingCart = New ArrayList
    Session("shoppingCartSession") = shoppingCart
End If

Dim existingProduct = shoppingCart.Cast(Of Product)().
                                   SingleOrDefault(Function(p) p.itemID = newProduct.itemID)

If existingProduct Is Nothing Then
    shoppingCart.Add(newProduct)
Else
    existingProduct.updateQualtity()
End If

Тем не менее, я также буду следовать предложению @VisualVincent и использовать List(Of Product) вместо ArrayList.Если вы сделаете это, то можете пропустить вызов Cast в предложенном мной коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...