最快的方法 - 迭代列表项并将其设置为选中状态

时间:2012-01-20 11:08:57

标签: c# performance listbox iteration selecteditem

目前我有一个包含工作人员列表的列表框和另一个包含列表框中所选工作人员姓名列表的数组。下面的代码表现如何,我正在寻找改进或更好的方法来做到这一点。

    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抱歉:))

2 个答案:

答案 0 :(得分:2)

您发布的代码实际上不起作用 - 只会选择列表中的最后一名员工。 你应该颠倒你的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)。

答案 1 :(得分:1)

更好的方法:

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(n log n)的复杂性。

修改

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