使方法更少的代码行

时间:2013-08-31 23:03:42

标签: c#

我有一个像下面这样的方法,有没有办法重构,更干净的方式,这样我可以用更少的代码行来实现它,例如删除if / for循环那样的

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 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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;
  }
}

答案 2 :(得分:4)

为了缩短此功能,您可以考虑使用

Dictionary<ProductId, CartItem> dict;

然后使用

而不是循环推车
if (dict.ContainsKey(productId))
{
    // add qty
} else {
    // add item to cart
}

答案 3 :(得分:1)

首先,有一个错误,因为您在添加缺失的项目后没有返回。因此,您将Qty添加到之前添加的同一项目中,因此它的值会加倍。

所以而不是:

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;
}