Как получить положение объекта в коллекции? - PullRequest
0 голосов
/ 06 апреля 2019

Требования:

У меня есть:

  • a Collection называется "users"
  • , который состоит из экземпляров Class, называемых "MatchClass"
  • "MatchClass" состоит только из двух свойств - userid и matchArray (плюс некоторые методы, не относящиеся к вопросу)

Что я хочу сделать

Это цикл по Collection, одновременно имея возможность

  • доступ к позиции в коллекции
  • доступ к свойствам экземпляра класса
  • найти наибольшее значение из всех matchArray s (они уже отсортированы) и сохранить userid

Что я пробовал до сих пор:

Для цикла Collection с For Each петлей

Dim users as New Collection
Dim i as Byte
Dim max as Integer: max = 0
Dim maxuser as String
' users Collection is  filled with instances of MatchClass 
' ... skipping code to simplify ...
Dim user as MatchClass
For Each user in users
        temp = user.matchArray(0, 0)
        If temp > max Then
            max = temp
            maxuser = users.Item ' <- this won't work
        End If
Next user

Тогда я не могу изменить положение user внутри For Each цикла

В качестве альтернативы, я попытался выполнить числовой цикл:

For i = users.Count to 1 Step -1
   users.Item(i).matchArray(0, 0) ' <- this won't work
Next i

К сожалению, это тоже не сработает, так как я не могу получить доступ к свойствам MatchClass экземпляров с помощью кода users.Item(i).


Возможно, есть лучшее решение для обоих миров, где я могу сделать оба? Чувствуется, что это должно быть что-то произвольное, что я просто скучаю.

Ответы [ 2 ]

1 голос
/ 06 апреля 2019
  • Если MatchClass - это объект, а users - это коллекция MatchClass экземпляров, тогда вам следует использовать ключевое слово Set для назначения ссылки на объект (я имею в виду эту строку maxuser = users.Item ' <- this won't work- но есть другая проблема с этой строкой (упоминается ниже)).
  • Когда вы просматриваете коллекцию (в VBA), вы просматриваете ее элементы.У вас нет доступа на чтение к его ключам.Так что Dim maxuser as String не имеет смысла, если у вас нет набора строк, которого у вас нет.
  • Члену Item объекта Collection требуется либо индекс, либо ключ, который былПервоначально использовался для добавления элемента в коллекцию.

Я не могу проверить это (поэтому я сам могу ошибаться), но мое мнение таково:

Private Sub FindMaxUser()
    Dim users As New Collection

    Dim i As Byte
    Dim max As Long: max = 0

    Dim temp As Long
    ' ... skipping code to simplify ...

    Dim user As MatchClass
    Dim maxuser As MatchClass ' <- Shouldn't be a string.

    For Each user In users
        temp = user.matchArray(0, 0)
        If temp > max Then
            max = temp
            Set maxuser = user ' <- MatchClass is an object. "Set" keyword is required for object references
        End If

    Next user
End Sub

Основные изменения здесьобъявить maxuser как MatchClass и использовать Set внутри цикла (когда найдено новое максимальное значение).

1 голос
/ 06 апреля 2019

Согласно моему комментарию, я ожидал, что любой из этих методов сработает.Рад быть доказанным неправильно, хотя, потому что они не проверены ...

Для каждого

Dim users As New Collection
Dim i As Byte
Dim max As Integer: max = 0
Dim maxuser As String
' users Collection is  filled with instances of MatchClass
' ... skipping code to simplify ...
Dim user As MatchClass

Dim lngIndex As Long

For Each user In users
        lngIndex = lngIndex + 1            
        temp = user.matchArray(0, 0)

        If temp > max Then
            max = temp
            maxuser = lngIndex
        End If
Next user

Для

Dim user As MatchClass

For i = users.Count To 1 Step -1
   Set user = users.item(i)
   matchArray = item.matchArray(0, 0)
Next i

Если бы я понял ваш вопрос, то я бы подумал, что любой из вышеперечисленных (если не оба) даст вам желаемый результат.

...