最快的方式-迭代列表项目并将其设置为选中

本文关键字:设置 项目 方式 列表 迭代 | 更新日期: 2023-09-27 18:20:48

当前我得到了一个包含工作人员列表的列表框和另一个包含在列表框中选择的工作人员名称列表的数组。以下代码的性能如何,我正在寻找改进或更好的方法。

    string[] keys = tempTaskRecord.GetWorkers().AllKeys;
    foreach (ListItem assignedEmployee in lstWorkers.Items)
    {
        foreach (string employeeName in keys)
        {
            assignedEmployee.Selected = assignedEmployee.Text.Equals(employeeName);
        }
    }

编辑代码

    string[] keys = tempTaskRecord.GetWorkers().AllKeys;
    foreach (ListItem assignedEmployee in lstWorkers.Items)
    {
        foreach (string employeeName in keys)
        {
            if (!assignedEmployee.Text.Equals(employeeName)) continue;
            assignedEmployee.Selected = true;
        }
    }

其中,

GetWorkers()返回一个NameValueCollection

lstWorkers是具有所有员工的列表项的ListBox

在.NET 2.0中工作(No Linq抱歉:))

最快的方式-迭代列表项目并将其设置为选中

您发布的代码实际上不会起作用,只会选择列表中的最后一名员工。您应该颠倒for循环的顺序来解决此问题 (已在编辑的代码中修复)。

我会这样做:

    lstWorkers.BeginUpdate();
    foreach (ListItem assignedEmployee in lstWorkers.Items)
    {
        assignedEmployee.Selected = keys.Contains(assignedEmployee.Text);
    }
    lstWorkers.EndUpdate();

如果您有很多选定的员工,可以考虑将keys转换为哈希集或类似的内容。

编辑:实际上,您可以使用NameValueCollection而不是键数组。

    var selected = tempTaskRecord.GetWorkers();
    lstWorkers.BeginUpdate();
    foreach (ListItem assignedEmployee in lstWorkers.Items)
    {
        assignedEmployee.Selected = (selected.Values(assignedEmployee.Text) != null);
    }
    lstWorkers.EndUpdate();

根据MSDN,如果每个密钥有一个工作者,那么selected.Values()就是O(1),所以这种方法就是O(n)。

更好的方法:

Dictionary<string, object> assignedOnes = new Dictionary<string, object>();
foreach(var key in keys)
  assignedOnes[key] = null;
foreach (ListItem assignedEmployee in lstWorkers.Items)
  assignedEmployee.Selected = assignedOnes.ContainsKey(assignedEmployee.Text);

这将把复杂性从O(n^2)降低到O(nlogn)。

编辑

经过进一步检查,字典似乎也"接近"O(1),这意味着所提出的算法也将是O(n)