|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
12.12.2004, 15:33 | #1 | |
Как удалить Selection Set, не зная его имени?
Штаб
Регистрация: 21.08.2003
Сообщений: 943
|
||
Просмотров: 6285
|
|
||||
Регистрация: 07.12.2010
Уфа
Сообщений: 425
|
Спасибо.
Да уж, это начало массива элементов не с "1", а с "0" и немедленная перенумерация наборов - столько времени потратил.... А удалять лучше с конца Код:
Код:
Если удалить сначала нулевой, потом первый, потом второй, потом ........, то на пятой итерации вывалится ошибка. И вот почему: было 0,1,2,3,...,9, после удаления набора с номером "0" стало 0*,1*,2*,3*,...,8*, после удаления набора с номером "1" (звездочкой отмечены наборы, у которых поменялся порядковый номер) стало 0,1*,2*,3*,...,7*, после удаления набора с номером "2" стало 0,1,2*,3*,...,6*, после удаления набора с номером "3" стало 0,1,2,3*,...,5*, после удаления набора с номером "4" стало 0,1,2,3,4*, при удалении набора с номером "5" вывалится ошибка, что такого набора не существует. В первом коде удаляем наборы с конца и перенумерации не происходит. (Как клавиша "Backspace") Во втором коде всегда удаляем набор с номером "0". (Как клавиша "Delete") Последний раз редактировалось Alexeipost, 08.11.2017 в 14:06. |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,053
|
Цитата:
1. Идет постоянное обращение к ThisDrawing.SelectionSets.Count при каждой иттерации (ну это копейки). 2. Если удалять первый элемент, то происходит постоянное смещение оставшихся к началу коллекции. |
|||
|
||||
КЖ; C# Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,589
|
Сергей812,
1. Ну обращается, не страшно. Больше 255 коллекций там все равно быть не может(может, но отладчик не показывает), так что вообще копейки. 2. Это же не массив, а "связный список", так какая разница, ресурсов на это смещение не тратиться, был бы массив, я бы согласился. Последний раз редактировалось Boxa, 08.11.2017 в 17:55. |
|||
|
||||
КЖ; C# Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,589
|
Сергей812, Класс LinkedList это вроде двухсвязный список, каждый элемент ссылается на следующий и предыдущий. Я имел ввиду что-то типа динамического массива (в .net это наверное ближе к List или ArrayList), т.е. "связный список" в простейшем Си понимании, если можно так выразится, каждый последующий элемент имеет ссылку на адрес предыдущего и при изменении размера этой структуры данных не происходит выделение новой памяти и перекопирование ее с изменениями, т.е. ресурсы тратятся, но по сравнению с массивами незначительно. Как то сумбурно написал...
|
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,053
|
Цитата:
|
|||
|
||||
КЖ; C# Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,589
|
Сергей812, Да, спасибо ознакомился с кодом. Действительно не верно сравнил связный список с List<T>, хотя с другой стороны VBA модуль не на .NET написан и потому я хотел бы надеяться, что коллекции и словари в VBA сделаны все таки связными списками (хотя кого я обманываю...).
Т.к. я не знаток VBA, то буду считать, что конструкция с do while несколько более читабельная и простая, а по затратам сравнима с другими реализациями. |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,053
|
Кстати
условие If не имеет смысла - при нулевом количестве наборов цикл просто не будет выполняться и не будет ошибки при обращении к коллекции ThisDrawing.SelectionSets по несуществующему индексу. |
|||