我有一个像下面这样的方法,有没有办法重构,更干净的方式,这样我可以用更少的代码行来实现它,例如删除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);
}
}
答案 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;
}