Страницы: 1
RSS
Эксперименты с SortedList
 
Листая форум наткнулся (в 2016 году, если память не изменяет) на сообщение от Hugo в одной из тем на тему этого объекта. Заинтересовало. Решил провести ряд экспериментов.
Интересовала в первую очередь скорость обработки данных и доступный в VBA инструментарий по работе с SortedList.
----------------
Для тех, кто не в курсе SortedList представляет из себя словарь (ключ, значение) сортирующий сам себя по факту наполнения. В качестве значения может сдержать: строки, числа, массивы, объекты.
---------------
Разочарование №1 - не доступна в VBA выгрузка ключей/итемов в массив, только циклом. Хотя такие методы есть
Разочарование №2 - скорость наполнения (в данном случае и одновременной сортировки) сопоставимо с Dictionary. Но наивно было бы ожидать большую разницу в меньшую сторону.
--------------
Тест-драйв по скорости:
Скрытый текст

Тестер:
Скрытый текст

Результат:
Скрытый текст

На миллионе SortedList завис минут на 10.
-----
В общем для небольших массивов пойдет.
----------------------------------------------------------------
Список доступных методов в VBA:
    Add - добавление пары ключ/значение
    Item - чтение/запись значения по ключу, или перезапись значения ключа
    Count - чтение - кол-во пар в SortedList
    Capacity - чтение/установка количества элементов объекта
Примеры:
Скрытый текст
    Clear - очистка объекта
    Clone - создание копии объекта
    Contains (Key) - проверка наличия определенного ключа в SortedList
    ContainsKey (Key) - проверка наличия определенного ключа в SortedList, т.е. тоже самое что и предыдущее
    ContainsValue (Value) - проверка наличия определенного элемента в SortedList. Не ключа. Полезная штука
    Equals(Object) - сравнение на идентичность двух объектов (например двa SortedList)
    GetByIndex(id) - добыча значения по индексу
    GetKey(id) - взять ключ по его индексу
    IndexOfKey(Key) - получаем индекс по ключу
    IndexOfValue(Value) - индекс по значению
    Remove(Key) - удаление пары ключ/элемент по ключу
    TrimToSize - подгонка пар ключ/элемент под определенное кол-во. В теории полезно только если был установлен завышенный размер массива элементов SortedList
Примеры:
Скрытый текст

---------------------------------------------------------------
Пример сортера на основе SortedList с примером же его использования:
Скрытый текст
Изменено: Anchoret - 20.02.2019 17:44:04
 
Цитата
Anchoret написал:
На миллионе SortedList завис минут на 10.
Anchoret, здесь сортировка 2 млн. строк с помощью "System.Collections.ArrayList", с учётом загрузки и выгрузки из коллекции - 21 секунда.
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, ArrayList позволяет выгрузить все ключи в массив одним махом) SortedList  - нет. Ну или я пока не дорылся до метода, с помощью которого это возможно (CopyTo(), GetKeyList() не работают в VBA).
 
Anchoret, да, не заметил сразу - это разные контейнеры. SortedList - не пользовался, но сейчас на своем примере протестировал.  Медленный даже для VBA. Загрузить и выгрузить массивом, штатно, тоже не выйдет.
Изменено: bedvit - 20.02.2019 16:44:46
«Бритва Оккама» или «Принцип Калашникова»?
 
В принципе тему можно добавить в местный справочник. Альтернативное название - Описание объекта SortedList с примерами его применения.
Страницы: 1
Наверх