У меня проблема с удалением всех объектов дерева из списка.
У меня есть List<String> Tags
, который содержит теги во всей моей системе, которые соответствуют определенному критерию (обычно начинается снекоторая строка поиска).У меня также есть корневой объект Device
.Класс Device
описывается следующим образом:
public class Device
{
public int ID;
public String Tag;
public EntityCollection<Device> ChildDevices;
}
Попытка, которую я сделал, состоит в том, чтобы сначала использовать поиск в ширину и удалять теги из списка при посещении каждого узла, а затем возвращать то, что осталось:
private List<String> RemoveInvalidTags(Device root, List<String> tags)
{
var queue = new Queue<Device>();
queue.Enqueue(root);
while (queue.Count > 0)
{
var device = queue.Dequeue();
//load all the child devices of this device from DB
var childDevices = device.ChildDevices.ToList();
foreach (var hierarchyItem in childDevices)
queue.Enqueue(hierarchyItem.ChildDevice);
tags.Remove(device.Tag);
}
return tags;
}
В данный момент я посещаю более 2000 узлов устройств и удаляю из списка около 1400 тегов (сокращено из-за строки поиска).Это занимает около 4 секунд, что слишком долго.
Я пытался изменить список тегов на хэш-набор, но это приводит к незначительным улучшениям скорости.
Любые идеи алгоритма / изменения, которые яможно использовать, чтобы сделать это быстрее?