Дикие тормоза при сортировке в TreeVie
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.03.05 21:10
Оценка: 6 (1)
Писал тут тесты к статье и оказалось, что встроенные в TreeView средства сортировки дико тормозят.

Если использовать только встроенную сортировку по строкам (ххх.Sorted = false), то еще куда не шло (хотя тоже мало пригодно для больших деревьев).

Если же воспользоваться возможностью подключения внешнего компарера (xxx.TreeViewNodeSorter = new MyComparer()), то жутчайшие тормоза начинаются на совсем смешных объемах.

Причем ручная реализация сортировки робатает даже значительно быстрее нежели встроенная. Причем код имеет смехотворный размер:
/// <summary>
/// Рекурсивная сортировка веток TreeView.
/// </summary>
/// <param name="rootNodes">Коллекция веток подлежащая сортировке</param>
private static void SortTreeNodes(
    TreeNodeCollection rootNodes,
    IComparer<TreeNode> comparer)
{
    int count = rootNodes.Count;
    if (count == 0)
        return;

    // Копируем содержимое коллекции подветок в массив,
    // сортируем этот массв, очищаем коллекцию и копируем 
    // подвекти обратно в коллекцию.
    TreeNode[] nodeArray = new TreeNode[count];
    rootNodes.CopyTo(nodeArray, 0);
    Array.Sort<TreeNode>(nodeArray, comparer);
    rootNodes.Clear();
    rootNodes.AddRange(nodeArray);

    // Сортируем все подветки
    foreach (TreeNode node in nodeArray)
        SortTreeNodes(node.Nodes, comparer);
}

В общем, дарю идею и надеюсь, что информация дойдет до тех кто занимается ВинФормсами.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Дикие тормоза при сортировке в TreeVie
От: Commandor16  
Дата: 05.07.05 19:46
Оценка:
Здравствуйте, VladD2,

Ваш код наверняка быстрый, но, если честно, я просто не знаю какой второй параметр нужно подставить в функию. Если ответите, то буду премного благодарен и если надо то же помогу если потребуется. А то я уже замучался с TreeViewNodeSorter: никак не могу заставить его сортировать выбранную ветку дерева (сортирует все дерево). Мне надо сделать универсальный компонент: TreeView + XmlView + ToolsStrip + ContextMenuStrip с внутренним редактированием xml (copy, paste, cut, insert, dragdrop ...) и все это за малый срок...


Вы писали:

VD>Писал тут тесты к статье и оказалось, что встроенные в TreeView средства сортировки дико тормозят.


VD>Если использовать только встроенную сортировку по строкам (ххх.Sorted = false), то еще куда не шло (хотя тоже мало пригодно для больших деревьев).


VD>Если же воспользоваться возможностью подключения внешнего компарера (xxx.TreeViewNodeSorter = new MyComparer()), то жутчайшие тормоза начинаются на совсем смешных объемах.


VD>Причем ручная реализация сортировки робатает даже значительно быстрее нежели встроенная. Причем код имеет смехотворный размер:

VD>
VD>/// <summary>
VD>/// Рекурсивная сортировка веток TreeView.
VD>/// </summary>
VD>/// <param name="rootNodes">Коллекция веток подлежащая сортировке</param>
VD>private static void SortTreeNodes(
VD>    TreeNodeCollection rootNodes,
VD>    IComparer<TreeNode> comparer)
VD>{
VD>    int count = rootNodes.Count;
VD>    if (count == 0)
VD>        return;

VD>    // Копируем содержимое коллекции подветок в массив,
VD>    // сортируем этот массв, очищаем коллекцию и копируем 
VD>    // подвекти обратно в коллекцию.
VD>    TreeNode[] nodeArray = new TreeNode[count];
VD>    rootNodes.CopyTo(nodeArray, 0);
VD>    Array.Sort<TreeNode>(nodeArray, comparer);
VD>    rootNodes.Clear();
VD>    rootNodes.AddRange(nodeArray);

VD>    // Сортируем все подветки
VD>    foreach (TreeNode node in nodeArray)
VD>        SortTreeNodes(node.Nodes, comparer);
VD>}
VD>

VD>В общем, дарю идею и надеюсь, что информация дойдет до тех кто занимается ВинФормсами.
Re[2]: Дикие тормоза при сортировке в TreeVie
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.07.05 20:05
Оценка:
Здравствуйте, Commandor16, Вы писали:

C>Здравствуйте, VladD2,


C>Ваш код наверняка быстрый, но, если честно, я просто не знаю какой второй параметр нужно подставить в функию. Если ответите, то буду премного благодарен и если надо то же помогу если потребуется.




class MSBuildTreeViewNodeSorter : IComparer, IComparer<TreeNode>
{
    #region IComparer Members

    public int Compare(object x, object y)
    {
        return Compare((TreeNode)x, (TreeNode)y);
    }

    #endregion

    #region IComparer<TreeNode> Members

    // Вот тут должна быть собственная процедура сравнения. 

    public int Compare(TreeNode x, TreeNode y)
    {
        if (x.Tag != null && y.Tag == null)
            return 1;

        if (x.Tag == null && y.Tag != null)
            return -1;

        return x.Text.CompareTo(y.Text);
    }

    public bool Equals(TreeNode x, TreeNode y)
    {
        return Compare(x, y) == 0;
    }

    public int GetHashCode(TreeNode obj)
    {
        return obj.Text.GetHashCode();
    }

    #endregion
}
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Дикие тормоза при сортировке в TreeVie
От: Commandor16  
Дата: 05.07.05 20:42
Оценка:
Здравствуйте, VladD2,

Огромное спасибо: разобрался и заработало.
Offtop: Редактор XML
От: PeterZT  
Дата: 08.07.05 18:03
Оценка:
Здравствуйте, Commandor16, Вы писали:


C>Мне надо сделать универсальный компонент: TreeView + XmlView + ToolsStrip + ContextMenuStrip с внутренним редактированием xml (copy, paste, cut, insert, dragdrop ...) и все это за малый срок...


Прикольно, три месяца назад сочинял Design Spec на похожую тему. Может кто знает контролы для редактирования XML and related для WinForms?
... << RSDN@Home 1.1.4 stable rev. 510>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.