Самый быстрый способ - итерировать элементы списка и устанавливать их выбранными - PullRequest
0 голосов
/ 20 января 2012

В настоящее время я получил список со списком работников и другой массив, содержащий список имен работников, которые выбраны в списке.Насколько хорошо будет работать приведенный ниже код, я ищу улучшения или лучший способ сделать это.

    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, извините :))

Ответы [ 2 ]

2 голосов
/ 20 января 2012

Код, который вы разместили, на самом деле не будет работать - будет выбран только последний сотрудник в списке. Вы должны изменить порядок своих циклов 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();

selected.Values() - это O (1), если у вас есть один рабочий на ключ в соответствии с MSDN , поэтому этот подход - O (n).

1 голос
/ 20 января 2012

Лучший способ:

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).

Редактировать

После дальнейшей проверки кажется, что словарь также 'приближается к' O (1), означая, что представленный алгоритм также будет O (n)

...