petshop之购物车再思考
我先不说泛型Dictionary的应用了,这个会放在另一篇中讲。那么今天就来看看这个购物车的实现全过程吧。
首先先来看吧商品添加到购物车的函数Add吧(按照常例先贴代码):
public void Add( string itemId) { CartItemInfo cartItem; //声明一个购物车实体类变量 if (!cartItems.TryGetValue(itemId, out cartItem)) { //如果键值不存在,下面的else中如果键值存在了Quantity增加一, //但是如果键值没有存在了他就没有处理数量了,这个时候数量应该是1,是默认的值,请看实体类CartItemInfo就知道了 Item item = new Item(); //实例化一个宠物的类(在MSPetShop4数据库中) ItemInfo data = item.GetItem(itemId); //通过宠物编号得到宠物的基本信息,并将其赋值给ItemInfo这个实体类 if (data != null ) { //这个CartItemInfo是相对于MSPetShopProfile数据库的,这样的话就在不同数据库之间传递数据了 CartItemInfo newItem = new CartItemInfo(itemId, data.ProductName, 1, ( decimal )data.Price, data.Name, data.CategoryId, data.ProductId); cartItems.Add(itemId, newItem); //在字典中添加新建itemid } } else cartItem.Quantity++; //如果可以在字典中找到键值,则将宠物数量加1 } |
1、其实上面我都有做解释的,但这边还是要说下他们用到的技巧。首先,动物的基本信息(如价格,所属类别等)都再MSPetshop4中,而我们的购物车信息室在
MSPetShop4Profile数据库中,那么这边就用到了两个数据库中的信息的传递,这个传递其实也很简单,并非想象中的那么复杂。想象前台我们点击某样东西,然后添加到购物车,这两步过程其实涉及到两个不同的数据库(分别为上面两个),然后就是吧MSPetshop4中item的相关信息添加到MSPetShop4Profile中的CartItem中。说滴有点罗嗦。
2、看下实体类CartItemInfo吧
[Serializable] public class CartItemInfo { // Internal member variables private int quantity = 1; private string itemId; private string name; private string type; private decimal price; private string categoryId; private string productId; |
看到没,它在生命变量的时候就已经吧购买的数量默认设置为1了。聪明吧。
二、更新购物车的相关宠物的购买数量:
public void SetQuantity( string itemId, int qty) { cartItems[itemId].Quantity = qty; } |
其实这个没有什么好说的,就是根据itemid对其Quantity进行修改吧了。
三、计算购物的总价钱:
public decimal Total { get { decimal total = 0; foreach (CartItemInfo item in cartItems.Values) //cartItems.Values是获取值的集合,从下面的操作我们可以看出,如果字典中已经存在键值的话,我们是直接获取Quantity的 total += item.Price * item.Quantity; return total; } } |
这个是计算中价钱的方法,这边他们用了一个foreach循环吧购物车中的相关宠物的价钱累计起来。
四、下面这种添加购物车信息的方法在petshop中没有真正的用到:
public void Add(CartItemInfo item) { CartItemInfo cartItem; if (!cartItems.TryGetValue(item.ItemId, out cartItem)) //参数一item.ItemId是键值, //如果Dictionary包含键值返回true,cartItem应该是返回的值,这里的话应该是ItemId, //但我不明白cartItem怎么匹配ItemId?否则false。 //这个问题我可能已经明白了,因为如果键值已经存在了,我们就输出了cartItem类型, //这个应该相当于引用类型,我们再后面的数量添加自然也会添加到字典中了 cartItems.Add(item.ItemId, item); //如果字典中不包含ItemId,将item.ItemId和item添加到词典中 else cartItem.Quantity += item.Quantity; //如果ItemId在字典中可以找到,就更新ItemId对应的宠物数量,// //但是为什么购物车包含那么都属性,而这里只添加了他的数量呢? //经过思考,我现在也可能明白为什么只添加数量了,因为你键值既然存在了, //那么你就有相应的宠物的信息啦,那么你需要知道的是数量有没有变量罢了 } |
这个方法是直接传递一个CartItemInfo这个实体类进来,也就是说它不是像上面传递itemid的,这样的方面的好处是跟淘宝有点像,就是你前台可以选购你要买的东东的各样属性,比如颜色啊比如数量啊,这个方法非常好很好。
五、得到购物车里的所有CartItemInfo的信息,这个方法应该是直接点击下订单的时候才会有用到吧:
public ICollection<CartItemInfo> CartItems { get { return cartItems.Values; } //得到购物车中的所有内容(用一个对象返回) } |
六、下订单
/// <summary> /// Method to convert all cart items to order line items /// </summary> /// <returns>A new array of order line items</returns> public LineItemInfo[] GetOrderLineItems() { LineItemInfo[] orderLineItems = new LineItemInfo[cartItems.Count]; int lineNum = 0; foreach (CartItemInfo item in cartItems.Values) orderLineItems[lineNum] = new LineItemInfo(item.ItemId, item.Name, ++lineNum, item.Quantity, item.Price); return orderLineItems; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南