Пока единственным способом который я смог придумать для определения номера элемента в колекции являеться перебор в цыкле всех элементов. Возможно кто то знает более эфективные способы?
[vba]
Код
Option Explicit Dim coll As Collection Function Index(Key As String) As Long Dim Item As Variant: Index = 0 For Each Item In coll Index = Index + 1 If Item = Key Then Exit Function Next Index = 0 End Function Sub test() Set coll = New Collection coll.Add "a": coll.Add "b": coll.Add "c" Debug.Print Index("c") End Sub
[/vba]
Пока единственным способом который я смог придумать для определения номера элемента в колекции являеться перебор в цыкле всех элементов. Возможно кто то знает более эфективные способы?
[vba]
Код
Option Explicit Dim coll As Collection Function Index(Key As String) As Long Dim Item As Variant: Index = 0 For Each Item In coll Index = Index + 1 If Item = Key Then Exit Function Next Index = 0 End Function Sub test() Set coll = New Collection coll.Add "a": coll.Add "b": coll.Add "c" Debug.Print Index("c") End Sub
Насколько я понимаю, суть использования коллекции (в VBA, и не только) в том и состоит, что "индекс" (порядковый номер элемента) не нужен. Это же динамический список, и поэтому сегодня "порядковый номер" может быть одним, а завтра - другим... Для этого и существует .Add Item, ItemKey, [Before|After]. Ведь Item - это не просто переменная, это объект, а ItemKey - как раз и определяет ключ для быстрого доступа к объекту. А ваш "Key" может быть просто свойством этого объекта. Вы же пытаетесь решать задачу типа "поиск порядкового номера по ключу". Это из серии того, что вы в книге будете определять,что лист с именем "Отчёт 666" - это третья закладка. Что даст это знание? Скорее всего, вы пытаетесь использовать коллекцию в задаче, алгоритм которой предполагает использование других средств...
Насколько я понимаю, суть использования коллекции (в VBA, и не только) в том и состоит, что "индекс" (порядковый номер элемента) не нужен. Это же динамический список, и поэтому сегодня "порядковый номер" может быть одним, а завтра - другим... Для этого и существует .Add Item, ItemKey, [Before|After]. Ведь Item - это не просто переменная, это объект, а ItemKey - как раз и определяет ключ для быстрого доступа к объекту. А ваш "Key" может быть просто свойством этого объекта. Вы же пытаетесь решать задачу типа "поиск порядкового номера по ключу". Это из серии того, что вы в книге будете определять,что лист с именем "Отчёт 666" - это третья закладка. Что даст это знание? Скорее всего, вы пытаетесь использовать коллекцию в задаче, алгоритм которой предполагает использование других средств...AndreTM
Извините за долгое отсутствие. Пришлось немного отвлечься от темы. Теперь подробнее. Попался в руки код в котором параллельно заполняется массив и коллекция и потом в коллекции проверяют наличие элемента после чего перебирается массив в поисках этого элемента. и проводятся определенные манипуляции с найденной строкой массива. Код подразумевает что номер элемента коллекции соответствует номеру строки массива. Отсюдова собственно и растут ноги моего вопроса, так как не хочется каждый раз перебирать массив в поисках номера строки содержащей элемент заранее зная что он совпадает с номером элемента в коллекции.
Извините за долгое отсутствие. Пришлось немного отвлечься от темы. Теперь подробнее. Попался в руки код в котором параллельно заполняется массив и коллекция и потом в коллекции проверяют наличие элемента после чего перебирается массив в поисках этого элемента. и проводятся определенные манипуляции с найденной строкой массива. Код подразумевает что номер элемента коллекции соответствует номеру строки массива. Отсюдова собственно и растут ноги моего вопроса, так как не хочется каждый раз перебирать массив в поисках номера строки содержащей элемент заранее зная что он совпадает с номером элемента в коллекции.Poltava
Может там не коллекция, а словарь? Вот в словаре как раз удобно держать ключ с номером строки массива. И сразу по ключу имеем доступ к данным в массиве.
Может там не коллекция, а словарь? Вот в словаре как раз удобно держать ключ с номером строки массива. И сразу по ключу имеем доступ к данным в массиве.Hugo
Hugo, К сожалению именно коллекции. Я понимаю что использовать словарь было бы правильнее и эффективнее. Но код не мой, а использованы были именно коллекции. Наверно все же придется переписать на словари потому как кроме перебора ничего в голову так и не пришло.
Hugo, К сожалению именно коллекции. Я понимаю что использовать словарь было бы правильнее и эффективнее. Но код не мой, а использованы были именно коллекции. Наверно все же придется переписать на словари потому как кроме перебора ничего в голову так и не пришло.Poltava
Сообщение отредактировал Poltava - Понедельник, 11.11.2013, 16:32
Попался в руки код в котором параллельно заполняется массив и коллекция и потом в коллекции проверяют наличие элемента после чего перебирается массив в поисках этого элемента. и проводятся определенные манипуляции с найденной строкой массива. Код подразумевает что номер элемента коллекции соответствует номеру строки массива. Отсюдова собственно и растут ноги моего вопроса, так как не хочется каждый раз перебирать массив в поисках номера строки содержащей элемент заранее зная что он совпадает с номером элемента в коллекции.
Попался в руки код в котором параллельно заполняется массив и коллекция и потом в коллекции проверяют наличие элемента после чего перебирается массив в поисках этого элемента. и проводятся определенные манипуляции с найденной строкой массива. Код подразумевает что номер элемента коллекции соответствует номеру строки массива. Отсюдова собственно и растут ноги моего вопроса, так как не хочется каждый раз перебирать массив в поисках номера строки содержащей элемент заранее зная что он совпадает с номером элемента в коллекции.
Hugo, данный способ меня устраивает и в коде фактически ничего менять не нужно спасибо за подсказку, а то сам не дошел. я уже к Collection_ от nerv, прикрутил свойство index вычисляемое через перебор.
Hugo, данный способ меня устраивает и в коде фактически ничего менять не нужно спасибо за подсказку, а то сам не дошел. я уже к Collection_ от nerv, прикрутил свойство index вычисляемое через перебор.Poltava