Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Коллекция типов Добавлено: 24.11.05 13:17  

Автор вопроса:  LamerOnLine | ICQ: 334781088 
Трабла следующего рода.
Есть структура пользовательских типов с многократным вложением, есть коллекция этих структур. Но!
При добавлении в коллекцию все поля структур становятся Variant, что недопустимо. Обойтись массивом вместо коллекции проблемно - элементы должны удаляться. Есть у кого оптимальное решение проблемы?

Ответить

  Ответы Всего ответов: 8  

Номер ответа: 1
Автор ответа:
 Dushes



ICQ: 249195431 

Вопросов: 8
Ответов: 110
 Профиль | | #1 Добавлено: 24.11.05 13:20
А чем же проблемно обходиться массивами. Есть же Redim Preserve. А уж если ты хочешь использовать коллекцию, то вместо типа данных используй класс с тем же набором свойств.

Ответить

Номер ответа: 2
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #2 Добавлено: 24.11.05 13:42
Массивы проблемны тем что удалить элемент из середины массива - гемор какого поискать...
Классы тут совсем не катят по двум причинам:
1. Нужна высокая скорость работы, софт работает в реальном времени.
2. Специфика работы с полями - через CopyMemory. С классом это куда сложнее :)

Ответить

Номер ответа: 3
Автор ответа:
 Victor



ICQ: 345743490 

Вопросов: 42
Ответов: 385
 Web-сайт: vt-dbnz.narod.ru
 Профиль | | #3
Добавлено: 25.11.05 01:00
Массивы проблемны тем что удалить элемент из середины массива - гемор какого поискать...
В чем проблема-то?
Сделать своп элемента который надо удалить в конец массива и Redim Preserve Arr(? to ubound(Arr)-1).

Ответить

Номер ответа: 4
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #4 Добавлено: 25.11.05 12:07
Интересно как это
Есть идеи как поменять местами элементы массива. Точнее, перекинуть нужный в конец, а остальные сдвинуть к началу. Кроме цмкла, конечно.
CopyMemory тут не катит, структура элементов сложная.

Ответить

Номер ответа: 5
Автор ответа:
 Victor



ICQ: 345743490 

Вопросов: 42
Ответов: 385
 Web-сайт: vt-dbnz.narod.ru
 Профиль | | #5
Добавлено: 25.11.05 19:16
Сделать массив перестановок.
Иначе говоря, все элементы списка хранятся в х.-з.-каком порядке в каком-то массиве. И есть массив индексов, который хранит порядок этих элементов. А так как индексы - лонги, то гнать их циклом будет уже не так долго.

Есть идеи как поменять местами элементы массива. Точнее, перекинуть нужный в конец, а остальные сдвинуть к началу. Кроме цмкла, конечно.
Есть только идеи, как не двигать все элементы, а сделать следующее:

берем элемент, который надо удалить, и удаляем. Затем пишем туда последний элемент массива.
Затем делаем Redim Preserve для уменьшения длины массива на единицу (то биш удаления того элемента, что мы только что скопировали на то место, где находился тот, который первоначально надо было удалить).

Надеюсь, понятно.
Или, как я уже написал, использовать массив перестановок.

Ответить

Номер ответа: 6
Автор ответа:
 ANDREY



Вопросов: 0
Ответов: 33
 Профиль | | #6 Добавлено: 26.11.05 22:46
Почитай: http://www.vbstreets.ru/VB/Articles/66160.aspx

Ответить

Номер ответа: 7
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #7 Добавлено: 28.11.05 11:51
Да, это я, конечно, знаю, но повторю - структура типа сложная, со многочисленными вложениями, и писать граббер, который будет этим заниматься - муторное дело. Выйдет еще отстойнее чем с Variant.
Решил проблему более кривым способом - добавил однострочную функцию, которая принимает в качестве аргумента элемент коллекции и возвращает его как требуемый тип. Не очень красиво, зато без АПИ, груды кода и возможности сглючить :)

Ответить

Номер ответа: 8
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #8 Добавлено: 28.11.05 12:43
Кстати, попутный вопрос.
Допустим, делаю так - присваиваю удаляемому элементу последний элемент массива, затем делаю Redim Preserve. Проверил - данные вложенных структур тоже сохраняются, но терзают смутные сомнения - не возникает ли утечка памяти?

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам