Как обратиться к первому элементу коллекции?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
LeonidSN
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 11.05.2007 (Пт) 12:36

Как обратиться к первому элементу коллекции?

Сообщение LeonidSN » 31.01.2009 (Сб) 13:40

Вопрос в том, как наверняка обратиться к первому элементу коллекции, если неизвестен принцип индексации этих элементов?
Код: Выделить всё
Function GetFirstMember(MyCol As Collection) As String
    GetFirstMember = MyCol(1)  'не катит
    'может так:
     Dim vString As String
    For Each vString In MyCol
        GetFirstMember = vString
        Exit For
    Next vString

'при условии, что цикл  For Each всегда начинает свой перебор
'именно с первого элемента. Не уверен, что это именно так?

End Function

:?:

Возможно, кто посоветут еще способы.
Спасибо

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как обратиться к первому элементу коллекции?

Сообщение Хакер » 31.01.2009 (Сб) 13:49

Разбили копилку. Лежит на полу кучка монет. Которая из них — первая?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Как обратиться к первому элементу коллекции?

Сообщение Debugger » 31.01.2009 (Сб) 13:57

Та, которую добавили первой.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как обратиться к первому элементу коллекции?

Сообщение Хакер » 31.01.2009 (Сб) 14:53

Ага. Т.е. в твоём понимании — первый элемент коллекции это тот, который в хронологическом порядке был добавлен раньше всех остальных?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

LeonidSN
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 11.05.2007 (Пт) 12:36

Re: Как обратиться к первому элементу коллекции?

Сообщение LeonidSN » 31.01.2009 (Сб) 15:32

Ребята, не затемняйте суть вопроса. Первый элемент, это элемент имеющий самый низкий (наименьший) индекс.
Или есть другие варианты?

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Как обратиться к первому элементу коллекции?

Сообщение Debugger » 31.01.2009 (Сб) 15:37

Xaкер. Почему бы нет? Как уже было написано,
Код: Выделить всё
    Dim c As New Collection
    c.Add "3", "3"
    c.Add "4", "4"
    c.Add "1", "1"
    c.Add "2", "2"
    Dim s
    For Each s In c
        MsgBox s
        Exit For
    Next

LeonidSN. Принцип индексации не известен. Если ты уверен, что в коллекцию сначала положат элемент, который должен быть первым, а потом - который должен быть вторым, то код, описанный выше, должен работать.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как обратиться к первому элементу коллекции?

Сообщение Хакер » 31.01.2009 (Сб) 16:08

Первый элемент, это элемент имеющий самый низкий (наименьший) индекс.

У элементов вообще может не быть индекса. Какой из них тогда первый?

Вы уж, пожалуйста, определитесь с критериями, которым должен соответствовать элемент, чтобы считаться первым.

Debugger, вот, считает, что первый элемент это тот, который был добавлен раньше других.
Автор, как мне кажется, считает, что первый этот тот, который самым первым будет перечислен в foreach-цикле.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Как обратиться к первому элементу коллекции?

Сообщение tyomitch » 31.01.2009 (Сб) 18:56

Хакер писал(а):Debugger, вот, считает, что первый элемент это тот, который был добавлен раньше других.
Автор, как мне кажется, считает, что первый этот тот, который самым первым будет перечислен в foreach-цикле.

А почему они должны не совпасть?
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как обратиться к первому элементу коллекции?

Сообщение Хакер » 31.01.2009 (Сб) 21:06

tyomitch писал(а):А почему они должны не совпасть?

Потому что у коллекционного метода Add есть такие аргументы как Before и After.

Пример:
Код: Выделить всё
Set c = New Collection
    Dim p As CPerson
   
    Set p = New CPerson
    p.nm = "Первый": c.Add p
   
    Set p = New CPerson
    p.nm = "Второй": c.Add p, , 1
   
    Set p = New CPerson
    p.nm = "Третий": c.Add p
    Set p = Nothing
   
    Dim i As CPerson
    For Each i In c
        Debug.Print i.nm
    Next i


В Immediate Pane мы при этом увидим следующее:
Код: Выделить всё
Второй
Первый
Третий


Так что я не зря сказал определиться с критерием, которому должен соответствовать элемент, чтобы быть "первым".
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

LeonidSN
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 11.05.2007 (Пт) 12:36

Re: Как обратиться к первому элементу коллекции?

Сообщение LeonidSN » 31.01.2009 (Сб) 21:08

У элементов вообще может не быть индекса


Как это, как это?

Вопрос, по-видимому, можно переформулировать: Можно ли считать, что цикл For Each всегда перебирает элементы коллекции в порядке индексации элементов, а автоматическая индексация идет в порядке добавления элементов?
То есть, For Each всегда начинает с первого элемента коллекции...

Во всяком случае, простой эксперимент подтверждает эту закономерность.

Я вот в одной хорошей книжке прочел:"По неизвестным причинам нельзя получить значение ключа для заданного элемента семейства" То же самое можно сказать и об индексе элемента. Следовательно, невозможно отсортировать по индексу готовую коллекцию и приходится искать косвенные методы типа цикла For Each .

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как обратиться к первому элементу коллекции?

Сообщение Хакер » 31.01.2009 (Сб) 21:13

LeonidSN писал(а):Я вот в одной хорошей книжке прочел:"По неизвестным причинам нельзя получить значение ключа для заданного элемента семейства"

Если там точно так написано, то КГ/АМ.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

LeonidSN
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 11.05.2007 (Пт) 12:36

Re: Как обратиться к первому элементу коллекции?

Сообщение LeonidSN » 01.02.2009 (Вс) 20:12

И все таки ответа на вопрос нет.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как обратиться к первому элементу коллекции?

Сообщение Хакер » 01.02.2009 (Вс) 21:58

Ещё бы.

Ты внимательно читал то, что тебе пишут, или фильтровал сообщения и оставлял только то, что потенциально смахивает на готовый ответ?

Ещё раз: нельзя ответить на вопрос "Как обратиться к первому элементу коллекции" если непонятно, что считать "первым" элементом коллекции.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Re: Как обратиться к первому элементу коллекции?

Сообщение Zenitchik » 02.02.2009 (Пн) 11:50

Первый элемент, это элемент имеющий самый низкий (наименьший) индекс

ЕМНИП, у объекта Collection индекс тождественен позиции в сборе. Если, конечно, это коректно называть индексом.
Знание английского языка - затрудняет понимание кода

LeonidSN
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 11.05.2007 (Пт) 12:36

Re: Как обратиться к первому элементу коллекции?

Сообщение LeonidSN » 02.02.2009 (Пн) 20:16

Хакер писал(а):... потенциально смахивает на готовый ответ?

Хорошо сказано, с любезного разрешения автора возьму на вооружение.
Я пытался представить критерий, но кажется, не был услышан.

у объекта Collection индекс тождественен позиции в сборе. Если, конечно, это коректно называть индексом.

Да даже если это совсем не корректно, должны же элементы коллекции ...(а что значит " позиции в сборе" - позиция кого или чего?) как-то отделяться, отличаться друг от друга. Если они не имеют ключа, то что их помечает, если не индекс?

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Re: Как обратиться к первому элементу коллекции?

Сообщение Zenitchik » 02.02.2009 (Пн) 21:11

LeonidSN
Уже и я перестал понимать, чего Вы хотите. Вы что, никогда к элементу сбора (Collection) по индексу не обращались?
Последний раз редактировалось Zenitchik 02.02.2009 (Пн) 21:14, всего редактировалось 1 раз.
Знание английского языка - затрудняет понимание кода

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как обратиться к первому элементу коллекции?

Сообщение Хакер » 02.02.2009 (Пн) 21:12

Я пытался представить критерий, но кажется, не был услышан.

Где? (Вопрос "Где?" подразумевает ссылку на пост в качестве ответа или цитату)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

LeonidSN
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 11.05.2007 (Пт) 12:36

Re: Как обратиться к первому элементу коллекции?

Сообщение LeonidSN » 02.02.2009 (Пн) 22:47

Так, кажется разобрался. Цитата из Руководства : Microsoft Visual Basic 6.0 Programmer's Guide:
"Индекс (index) является длинным целым (Long) числом, принимающим значение между единицей (1) и числом элементов в наборе"

То есть нименьший индекс в наборе основанном на единице (one-based) всегда равен 1.
Моей ошибкой было предположение, что программист может изменять индексацию не только отдельных элементов, но и набора в целом.

Спасибо всем откликнувшимся!

GDK
Обычный пользователь
Обычный пользователь
 
Сообщения: 80
Зарегистрирован: 23.10.2008 (Чт) 16:15

Re: Как обратиться к первому элементу коллекции?

Сообщение GDK » 03.02.2009 (Вт) 13:50

Совет - пользуйтесь не коллекциями, а объектами "Dictionary". По моему они в библиотеке VBScripting Runtime есть.
К стати у них нумерация с нуля как в листбоксах и комбобоксах и можно менять содержимое "элемента" этой коллекции не удаляя его, что невозможно в обычных коллекциях.

LeonidSN
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 11.05.2007 (Пт) 12:36

Re: Как обратиться к первому элементу коллекции?

Сообщение LeonidSN » 03.02.2009 (Вт) 20:20

GDK писал(а):Совет - пользуйтесь не коллекциями, а объектами "Dictionary". По моему они в библиотеке VBScripting Runtime есть.
К стати у них нумерация с нуля как в листбоксах и комбобоксах и можно менять содержимое "элемента" этой коллекции не удаляя его, что невозможно в обычных коллекциях.


Спасибо за совет.
Мне эта структура знакома и она во многом удобнее чем Collection. Но общая беда программ на VB - необходимость использования многочисленных библиотек. В частности, по VBScripting Runtime я слышал, что сисадмины очень ее не любят и стараются закрыть к ней доступ не подшефных машинах, т.к. возможны проблемы со скриптами из Сети.
Если предполагаешь распространять свою прогу, то лучше воздержаться от использования такой библиотеки.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 61

    TopList  
cron