Ich würde mit Listen von Listen arbeiten, das dürfte Performancemässig am besten sein. Damit Du Dir nicht die FInger brichst, würde ich eine Klasse "ListEnhanced" definieren:
Class ListEnhanced
Public listContent List as Variant
Sub New()
End Sub
Und dann so:
Dim listsEnhanced List as ListEnhanced
Forall ProduktName in .... '- irgendwie aufbauen
If Not Iselement( listsEnhanced( ProduktName ) ) then
Set listsEnhanced( ProduktName ) = New ListEnhanced
End If
Forall Inhalt in ...
listsEnhanced( ProduktName ).listContent( Inhalt ) = Inhalt
End Forall
End Forall
Damit kannst Du dann sehr schnell zwei Listen aus unterschiedlicher Herkunft vergleichen...
Der IsElement- Vergleich bei Listen ist saumässig schnell.
Liste in Liste geht m.W. leider nicht, wenn das Listenelement ein Array ist, musst Du es wie ein Array behandeln (also z.B. durchlaufen).
Kannst aber auch das Array dann in eine Liste schreiben.
Dim liste1 List As Variant
Dim liste2 List As Integer
liste1 ("xxx") = Split ("a,b,c", ",")
If Iselement (liste1 ("xxx")) Then
Erase liste2
Forall element In liste1 ("xxx")
liste2 (element) = 1
End Forall
If Iselement (liste2 ("b")) Then
'Eintrag b in liste1 ("xxx") gefunden
End If
End If
Kommt drauf an, was Du konkret damit machen willst. Bei häufigen Suchen innerhalb des Array vielleicht sinnvoll
@skywook: Da die Member- Variable listContent public ist und auch wieder eine Liste, fragst Du die ganz normal ebenfalls mit IsElement ab:
If IsElement( listsEnhanced( ProduktName ).listContent( Inhalt ) ) then
'...gefunden
End If
oder wenn Du schon ein Objekt der Klasse ListEnhanced hast:
If IsElement( myListEnhanced.listContent( Inhalt ) ) then
'...gefunden
End If
@Peter: Deshalb ja die "Hilfsklasse", die ihrerseits eine Liste als Public Member- Variable hat... Damit kriegt man dann Listen in Listen.
Man könnte jetzt natürlich auch die Hilfsklasse erweitern um weitere Funktionen wie hasMember( ) und getMember() und addMember, dann spart man sich diese vielen Klammern und auch den direkt- Zugriff auf die Member- Variable:
Class ListEnhanced
Public listContent List as Variant
Sub New()
End Sub
Function hasMember( strMember as String ) as Boolean
hasMember = IsElement( Me.listContent( strMember ) )
End Function
Function getMember( strMember as String ) as Variant
If Me.hasMember( strMember ) then
getMember = Me.listContent( strMember )
End If
End Function
Sub addMember( strMember as String, varValue as Variant )
Me.listContent( strMember ) = varValue
End Sub
Dann würde der obige Code so aussehen:
If listsEnhanced( ProduktName ).hasMember( Inhalt ) then
'...gefunden: vergleichen
content = listsEnhanced( ProduktName ).getMember( Inhalt )
End If
'- oder
If myListEnhanced.hasMember( Inhalt ) then
'...gefunden: vergleichen
content = myListEnhanced.getMember( Inhalt )
End If
Und das kann man dann immer weiter spinnen... wie wäre es mit weiteren Management- Funktionen:
Class ListEnhanced
Private m_listContent List as Variant
Private m_lngCount as Long
Sub New()
Me.m_lngCount = 0
End Sub
Function hasMember( strMember as String ) as Boolean
hasMember = IsElement( Me.m_listContent ( strMember ) )
End Function
Function getMember( strMember as String ) as Variant
If Me.hasMember( strMember ) then
getMember = Me.m_listContent ( strMember )
End If
End Function
Sub addMember( strMember as String, varValue as Variant )
If not Me.hasMember( strMember ) then
Me.m_lngCount = Me.m_lngCount + 1
End If
Me.m_listContent ( strMember ) = varValue
End Sub
Sub removeMember( strMember as String )
If Me.hasMember( strMember ) then
Me.m_lngCount = Me.m_lngCount - 1
Erase Me.m_listContent( strMember )
End If
End Sub
Sub removeAllMembers()
Erase Me.m_listContent
Me.m_lngCount = 0
End Sub
Public Property Get length as Long
length = Me.m_lngCount
End Property
Public Property Get listContent as Variant
listContent = Me.m_listContent
End Property
Public Property Get isEmpty as Boolean
isEmpty = (Me.m_lngCount = 0)
End Property
Hier muss jetzt die Member- Variable für die Liste Private sein, damit sie nicht mehr von außen manipuliert werden kann (was den count invalidieren würde), damit ist nur noch ein Zugriff über die Funktionen möglich oder ein Read- Only Zugriff über die Property...
DISCLAIMER: Der Code ist im Browser runtergetippt. Er enthält vermutlich Tippfehler und -ganz wichtig- KEINERLEI Error- Handling. Solchen Code würde es bei mir produktiv nie geben. Aber als Basis ist er vermutlich brauchbar.