VirtualTreeview: когда сортировать детей?
Я полагаюсь на VirtualTreeView, чтобы отображать тысячи элементов, которые должны периодически меняться, и когда это происходит, дерево очищается и заполняется снова.
Сортировка производится автоматически (toAutoSort
установлен флаг), но это имеет нежелательный эффект рекурсивной инициализации всех узлов, и это очень дорогая операция, как вы можете себе представить.
Итак, когда я должен позвонить .Sort
метод, когда toAutoSort
выключен? (DoInitChildren выглядело правдоподобно, но я иногда получал странные результаты, например, обратные результаты, поэтому я полагаю, что сортировка детей не годится.)
2 ответа
Общее правило в этом сценарии - сортировка после добавления всех новых элементов. Таким образом, вы сортируете (и инициализируете) только один раз.
Если все дерево не будет полностью отличаться каждый раз, вы можете получить лучшую производительность, не очищая дерево, а создавая отдельно новый список элементов (просто идентифицируя элементы), сортируя этот список, а затем обходя оба дерева по порядку. Общий алгоритм выглядит примерно так (левый список - это "новый список", а правый список - "существующий список"):
LeftCur := 0;
RightCur := 0;
while (LeftCur < TotalLeft) and (RightCur < TotalRight) then
begin
if LeftList[LeftCur] = RightList[RightCur] then
begin
// matches, so just advance
Inc(LeftCur);
Inc(RightCur);
end
else if LeftList[LeftCur] < RightList[RightCur] then
begin
// insert happens BEFORE RightCur
InsertLeftItemToRight;
Inc(RightCur);
Inc(TotalRight);
end
else if LeftList[LeftCur] > RightList[RightCur] then
begin
DeleteRightItem;
Dec(TotalRight);
end;
end;
While RightCur < TotalRight do
begin
DeleteRightItem;
Dec(TotalRight);
end;
While LeftCur < TotalLeft do
AppendLeftItemToRight;
Таким образом, список остается отсортированным, и вам нужно только завершить загрузку элемента в шагах InsertLeftItemToRight. В дереве, когда вы подходите, вы запускаете аналогичную процедуру для детей. Эта концепция основана на том факте, что элементы в существующем списке не будут сильно меняться или могут стоить полной загрузки.