1

私は以下のような方法を持っています。リファクタリングする方法、よりクリーンな方法はありますか?

public void CheckProductExistThenAddToCart(CartItem item)
{
    if (CartItems.Count == 0) AddToCart(item);

    bool itemFound = false;
    foreach (var cartItem in CartItems)
    {
        if (cartItem.ProductId.Equals(item.ProductId))
        {
            itemFound = true;
            cartItem.Qty += item.Qty;
            break;
        }
    }

    if (!itemFound)
    {
        AddToCart(item);
    }
}
4

4 に答える 4

6

LINQ を使用できます。

public void CheckProductExistThenAddToCart(CartItem item)
{
     var existingItem = CartItems.FirstOrDefault(ci => ci.ProductID == item.ProductId);
     if (existingItem == null)
          CartItems.Add(item);
     else
          existingItem.Qty += item.Qty;
}
于 2013-08-31T23:07:08.393 に答える
6

SingleOrDefault( のコンテキストでProductId) 固有のアイテムがあることを保証する必要がある場合に使用できます。複数ある可能性があり、この事実を無視したい場合は、 に変更しFirstOrDefaultます。Singleここで意図を明示的に述べているので、私はより良いと思います。

public void CheckProductExistThenAddToCart(CartItem item)
{
  var existingItem = CartItems
      .SingleOrDefault(i => i.ProductId.Equals(item.ProductId));

  if (existingItem == null)
  {
    AddToCart(item);
  }
  else
  {
    existingItem.Qty += item.Qty;
  }
}
于 2013-08-31T23:07:59.237 に答える
4

この関数を短縮するために、

Dictionary<ProductId, CartItem> dict;

次に、カートをループする代わりに、使用するだけです

if (dict.ContainsKey(productId))
{
    // add qty
} else {
    // add item to cart
}
于 2013-08-31T23:10:05.233 に答える
1

まず、不足しているアイテムを追加した後に戻ってこないため、バグがあります。したがってQty、直前に追加したのと同じアイテムに追加すると、その値は 2 倍になります。

したがって、代わりに:

public void CheckProductExistThenAddToCart(CartItem item)
{
    if (CartItems.Count == 0) AddToCart(item);
    // missing return

    bool itemFound = false;
    foreach (var cartItem in CartItems)
    {
        if (cartItem.ProductId.Equals(item.ProductId))
        {
            itemFound = true; // ypu will find the same item you have justb added
            // ... causes this bug and is less efficient
            cartItem.Qty += item.Qty;
            ...

私はそうします(これもLinqで簡略化されています):

public void CheckProductExistThenAddToCart(CartItem item)
{
    if (CartItems.Count == 0) 
    {
        AddToCart(item);
        return;
    }

    CartItem oldItem = CartItems.FirstOrDefault(ci => ci.ProductId == item.ProductId);
    if(oldItem == null)
        AddToCart(item);
    else
        oldItem.Qty += item.Qty;
}
于 2013-08-31T23:14:39.363 に答える