【问题标题】:Fastest Way - Iterate List items and set them selected最快的方式 - 迭代列表项并将它们设置为选中
【发布时间】:2012-01-20 11:08:57
【问题描述】:

目前我有一个列表框,其中包含工人列表和另一个数组,其中包含在列表框中选择的工人的姓名列表。以下代码的性能如何,我正在寻找改进或更好的方法。

    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 中工作(抱歉,没有 Linq :))

【问题讨论】:

  • 你能给我们记录数 - keys.length 和 lstWorkers.Items.Count 吗?
  • @Dmitry yup 列表框数量是数百到 1K 的倍数(我也有搜索框),keys.length 现在没有限制

标签: c# performance listbox iteration selecteditem


【解决方案1】:

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

我会这样做:

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

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

编辑:实际上,您可以使用 NameValueCollection 代替 keys 数组。

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

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

【讨论】:

  • 编辑代码现在可以工作并选择分配的工人。我仍然不知道这是否会像 user676571 回答一样快
  • 我相信@user676571 的代码会类似,除了我的不需要通过keys 的第一个循环。您可以随时对其进行基准测试:)
  • 我认为这会更快。使用字典的任何轻微查找改进都将超过字典构造。
  • 老实说,我不明白这个操作怎么可能是 O(1)
  • @user676571:如文档中所述,哈希为 O(1)。我同意每个哈希桶中可能有多个条目,但它比其他任何东西都更接近 O(1)。
【解决方案2】:

更好的方法:

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'approaches' O(1),这意味着提出的算法也将是 O(n)

【讨论】:

    猜你喜欢
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 2022-06-13
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多