You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

优化.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 23:45:01