如何优化代码以提高C#中foreach循环的性能?

问题描述 投票:0回答:1

以下功能迭代时间较长,需要优化代码以提高获取数据的性能。你能帮我如何优化吗?

private List<ApplicationMenuItemDTO> toDTO(List<ApplicationMenuItem> list)
{
    if (list.Count() > 0)
    {
        ApplicationUser u = manager.FindById(User.Identity.GetUserId<int>());
        List<ApplicationMenuItemDTO> miDTOs = new List<ApplicationMenuItemDTO>();
        foreach(ApplicationMenuItem mi in list)
        {
            if (mi.PermissionId == null // menu items that do not require permission
                || u.HasPermission(mi.PermissionId)) // menu items user has permission to
            {
                miDTOs.Add(new ApplicationMenuItemDTO {
                    MenuItemId = mi.MenuItemId,
                    ParentMenuItemId = mi.ParentMenuItemId,
                    Name = mi.Name,
                    NamePlural = mi.NamePlural,
                    DisplayName = mi.DisplayName,
                    DisplayNamePlural = mi.DisplayNamePlural,
                    DeepLink = mi.DeepLink,
                    ApplicationPageId = mi.ApplicationPageId,
                    Description = mi.Description,
                    PermissionId = mi.PermissionId,
                    IsLocked = mi.IsLocked,
                    Url = mi.Url,
                    Rank = mi.Rank,
                    MenuItemTypeID = mi.MenuItemTypeID,
                    MenuItem = toDTO(db.ApplicationMenuItems.Where(x => x.ParentMenuItemId == mi.MenuItemId).ToList())
                });
            }
        }

        return miDTOs.OrderBy(x=>x.Rank).ToList();
    }
    else
    {
        //base case - return empty list
        return new List<ApplicationMenuItemDTO>();
    }
}
asp.net-mvc optimization c#-3.0 asp.net-apicontroller
1个回答
0
投票

很难说,因为OP没有写出性能问题在哪里,但这里有一些猜测。

ApplicationUser u = manager.FindById(User.Identity.GetUserId<int>());

我无法判断这个查询是否昂贵,但另一方面,它似乎并不依赖于任何

mi
数据。因此,您可以将其移出
foreach
循环。

这行代码:

MenuItem = toDTO(db.ApplicationMenuItems
    .Where(x => x.ParentMenuItemId == mi.MenuItemId)
    .ToList())

看起来好像它在每个循环迭代中执行一次数据库查询。因此,如果

list
中有 50 个项目,那么您将执行 50 个数据库查询。

尝试研究是否可以将数据库查询移出循环,而改为进行单个批量查询。然后使用

list
压缩或连接该查询的结果。

© www.soinside.com 2019 - 2024. All rights reserved.