优化.NET代码 高效实现多储物柜5插槽下拉框自动填充与选中功能
优化思路
本次优化主要解决4个核心问题:
- 消除硬编码5个插槽的重复逻辑,提升可维护性
- 减少不必要的集合遍历,提升查询效率
- 避免重复生成完全相同的产品下拉选项,降低内存占用
- 增加空值兼容,避免原代码中
ToList()[0]可能抛出的索引越界异常
优化后代码
1. 后端(Index.cshtml.cs)
首先调整页面属性定义,删除原来的OptionSlot1~OptionSlot5单独属性,改用共享下拉选项+选中值数组:
// 共享的产品下拉选项,全局只生成1次 public List<SelectListItem> ProductOptions { get; set; } // 索引对应插槽号,存每个插槽选中的产品ID,下标1~5对应插槽1~5 public int?[] SelectedProductIds { get; set; } = new int?[6]; public List<Locker> Lockers { get; set; }
业务逻辑优化:
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier); Lockers = await LockerManager.GetLockers(userId); var products = await ProductManger.GetProducts(userId); var boxes = await BoxManager.GetBoxes(userId); // 预生成全局共享的下拉选项 ProductOptions = products.Select(a => new SelectListItem { Value = a.Id.ToString(), Text = a.Name }).ToList(); // 把盒子按插槽号转成字典,查找效率O(1),替代原代码多次遍历列表 var boxDict = boxes.ToDictionary(k => k.BoxNo, v => v.ProductId); // 批量赋值每个插槽的选中产品ID for (int i = 1; i <=5; i++) { if (boxDict.TryGetValue(i, out var productId)) { SelectedProductIds[i] = productId; } }
2. 前端(Index.cshtml)
删除重复写5次的插槽代码,改用循环生成:
@foreach (var locker in Model.Lockers) { for (int slotNo = 1; slotNo <=5; slotNo++) { <div class="lockBox slot@(slotNo) unavailible"> <div> <select asp-items="Model.ProductOptions" asp-for="@Model.SelectedProductIds[slotNo]"> <option value="">– Empty slot –</option> </select> </div> @slotNo </div> } }
优化收益
- 代码量减少70%以上,后续调整插槽数量只需修改循环上限即可,无需逐个修改逻辑
- 下拉选项仅生成1次,相比原代码生成5份相同列表,内存占用降低80%
- 盒子查询从原有的5次全量遍历,改为1次字典构建+5次O(1)查询,数据量越大效率提升越明显
- 解决了原代码重复定义
box1、重复赋值OptionsSlot1的bug - 兼容空插槽场景,不会因为某个插槽未绑定产品抛出异常
内容的提问来源于stack exchange,提问作者Nabil Akhlaque
相关产品推荐
相关产品推荐

