代码优化以检查复选框列表中的某些项目

本文关键字:项目 列表 检查 复选框 代码优化 | 更新日期: 2023-09-27 18:24:49

考虑以下代码片段

列出订单列表;//此列表是预先填充的

foreach (System.Web.UI.WebControls.ListItem item in OrdersChoiceList.Items) // OrdersChoiceList is of type System.Web.UI.WebControls.CheckBoxList
{
     foreach (Order o in orderList)
     {
           if (item.id == o.id)
           {
               item.Selected = scopeComputer.SelectedBox;
               break;
           }
     }
}

列表中有数千个项目,因此这些循环非常耗时。我们如何优化它?

还有,我们如何才能用LINQ做同样的事情。我尝试使用联接操作,但无法基于"SelectedBox"设置"Selected"变量的值。现在我把select子句中的值硬编码为"true",我们如何传递&在选择子句中使用SelectedBox值

                 var v = (from c in ComputersChoiceList.Items.Cast<ListItem>()
                                    join s in scopeComputers on c.Text equals s.CName
                                        select c).Select(x=>x.Selected = true);

代码优化以检查复选框列表中的某些项目

我认为您需要消除嵌套迭代。正如您所说,这两个列表都有一大组项目。如果它们都有5000个项目,那么在最坏的情况下,您将看到25000000次迭代。

不需要为每个单独的CCD_ 2不断地重新迭代CCD_。相反,创建一个ID查找,以便对每个ID进行快速O(1)查找。不确定命中scopeComputer.SelectedBox需要做什么工作,但也可以在循环外解决。

bool selectedState = scopeComputer.SelectedBox;
HashSet<int> orderIDs = new HashSet<int>(orders.Select(o => o.id));
foreach (System.Web.UI.WebControls.ListItem item in OrdersChoiceList.Items)
{
    if (orderIDs.Contains(item.id))
        item.Selected = selectedState;
}

使用HashSet查找,您现在实际上只需要迭代5000次,再加上超快速查找。

EDIT:据我所知,ListItem上没有id属性,但我假设您发布的代码是为了简洁而浓缩的,但在很大程度上代表了您的整个过程。我将保留我的代码API/用法,以匹配您的代码;我假设它可以翻译回您的具体实现。

编辑:根据您编辑的问题,我认为您正在进行另一次检索scopeComputer引用的查找/迭代。类似地,您可以对此进行另一次查找:

HashSet<int> orderIDs = new HashSet<int>(orders.Select(o => o.id));
Dictionary<string, bool> scopeComputersSelectedState = 
    scopeComputers.ToDictionary(s => s.CName, s => s.Selected);
foreach (System.Web.UI.WebControls.ListItem item in OrdersChoiceList.Items)
{
    if (orderIDs.Contains(item.id))
        item.Selected = scopeComputersSelectedState[item.Text];
}

同样,不确定你的确切类型/用法。您也可以通过一个LINQ查询来压缩这一点,但我认为(从性能角度讲)您不会看到太大的改进。我还假设每个ListItem.Text条目都有一个匹配的ScopeComputer,否则访问orderList0时会出现异常。如果没有,那么将其更改为执行TryGetValue查找对您来说应该是一个微不足道的练习。