最小化 .NET 代码或提高效率

Posted

技术标签:

【中文标题】最小化 .NET 代码或提高效率【英文标题】:Minimizing .NET code or make it more efficient 【发布时间】:2021-11-17 20:40:03 【问题描述】:

我正在为具有 5 个插槽的产品开发一个电子储物柜系统的概述。 我想要实现的是自动填充每个“储物柜插槽”的下拉菜单并在每个插槽中选择正确的产品。

也可以有多个储物柜,所以我不知道实现这一目标的最佳和最有效的方法。

索引.cshtml

    @foreach (var locker in Model.Lockers)
                
                    <div class="lockBox slot1 unavailible">
                            <div>
                                <select asp-items="Model.OptionSlot1">
                                    <option value="">– Empty slot –</option>
                                </select>
                            </div>
                            1
                     </div>
<div class="lockBox slot2 unavailible">
                            <div>
                                <select asp-items="Model.OptionSlot2">
                                    <option value="">– Empty slot –</option>
                                </select>
                            </div>
                            2
                     </div>
<div class="lockBox slot3 unavailible">
                            <div>
                                <select asp-items="Model.OptionSlot3">
                                    <option value="">– Empty slot –</option>
                                </select>
                            </div>
                            3
                     </div>
<div class="lockBox slot4 unavailible">
                            <div>
                                <select asp-items="Model.OptionSlot4">
                                    <option value="">– Empty slot –</option>
                                </select>
                            </div>
                            4
                     </div>
<div class="lockBox slot5 unavailible">
                            <div>
                                <select asp-items="Model.OptionSlot5">
                                    <option value="">– Empty slot –</option>
                                </select>
                            </div>
                            5
                     </div>
                

索引.cshtml.cs

    var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
            Lockers = await LockerManager.GetLockers(userId);
            Products = await ProductManger.GetProducts(userId);
            Box = await BoxManager.GetBoxes(userId);

            var box1 = Box.Where(a => a.BoxNo == 1).ToList()[0];
            var prod1 = Products.Where(p => p.Id == box1.ProductId).ToList()[0];
            OptionsSlot1 = Products.Select(a => new SelectListItem
            
                Value = a.Id.ToString(),
                Text = a.Name,
                Selected = box1.ProductId == prod1.Id ? true : false
            ).ToList();

var box1 = Box.Where(a => a.BoxNo == 1).ToList()[0];
            var prod1 = Products.Where(p => p.Id == box1.ProductId).ToList()[0];
            OptionsSlot1 = Products.Select(a => new SelectListItem
            
                Value = a.Id.ToString(),
                Text = a.Name,
                Selected = box1.ProductId == prod1.Id ? true : false
            ).ToList();

var box2 = Box.Where(a => a.BoxNo == 2).ToList()[0];
            var prod2 = Products.Where(p => p.Id == box2.ProductId).ToList()[0];
            OptionsSlot2 = Products.Select(a => new SelectListItem
            
                Value = a.Id.ToString(),
                Text = a.Name,
                Selected = box2.ProductId == prod2.Id ? true : false
            ).ToList();

var box3 = Box.Where(a => a.BoxNo == 3).ToList()[0];
            var prod3 = Products.Where(p => p.Id == box3.ProductId).ToList()[0];
            OptionsSlot3 = Products.Select(a => new SelectListItem
            
                Value = a.Id.ToString(),
                Text = a.Name,
                Selected = box3.ProductId == prod3.Id ? true : false
            ).ToList();

var box4 = Box.Where(a => a.BoxNo == 4).ToList()[0];
            var prod4 = Products.Where(p => p.Id == box4.ProductId).ToList()[0];
            OptionsSlot4 = Products.Select(a => new SelectListItem
            
                Value = a.Id.ToString(),
                Text = a.Name,
                Selected = box4.ProductId == prod4.Id ? true : false
            ).ToList();

var box5 = Box.Where(a => a.BoxNo == 5).ToList()[0];
            var prod5 = Products.Where(p => p.Id == box5.ProductId).ToList()[0];
            OptionsSlot5 = Products.Select(a => new SelectListItem
            
                Value = a.Id.ToString(),
                Text = a.Name,
                Selected = box5.ProductId == prod5.Id ? true : false
            ).ToList();

【问题讨论】:

您要求使其更小或更高效。您是否遇到此代码的性能问题?还是你觉得代码太多? 减少代码量的一件事是删除所有? true : false。这就像说“如果值为真,则值为真,但如果值为假,则值为假”,而不仅仅是“值为真”或“值为假”。 @WouterdeKort,不,我没有遇到性能问题,但是一旦有 200 个插槽的储物柜,这种伤口是可持续的。 我希望看到一个循环然后为每个插槽编写代码。 您可以改用字典。并在 cshtml 中使用局部视图 【参考方案1】:

我现在已经能够将其缩小到一个循环。如果有其他人感兴趣,这里是代码:

IList<int> boxes = new List<int>  1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 2, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 ;

                                foreach (var boxNo in boxes)
                                
                                    var box = Model.Box.Where(a => a.BoxNo == boxNo && a.LockerId == locker.Id).ToList()[0];
                                    var status = (Model.Box.Where(x => x.BoxNo == boxNo && x.LockerId == locker.Id).ToList()[0].Status) == 1 ? "availible" : "unavailible";

                                    if (boxNo == 1 || boxNo == 2)
                                        status = "locked";

                                    <div class="box @status" id="box@(boxNo)">
                                        <div>
                                            <select name="@(locker.Id + "_" + @boxNo)" id="@(locker.Id + "_" + @boxNo)">
                                                <option value="0">–</option>
                                                @foreach (var product in Model.Products)
                                                
                                                    <option value="@product.Id" selected="@(box.ProductId == product.Id)">@product.Name</option>
                                                
                                            </select>
                                        </div>
                                        @boxNo
                                    </div>
                                

【讨论】:

以上是关于最小化 .NET 代码或提高效率的主要内容,如果未能解决你的问题,请参考以下文章

提高代码效率的 20 个JavaScript 技巧和窍门

提高代码效率的 20 个JavaScript 技巧和窍门

.NET程序员提高效率的70多个开发工具

使用分而治之的范式提高算法效率

提高python执行效率的方法?

如何改进此 Python 代码以提高效率?