Porównanie słownika, zbiorów i tablic

Staram się wypracować względne korzyści i cechy słowników w porównaniu ze zbiorami i tablicami.

Znalazłem doskonały artykuł TUTAJ ale nie mogę znaleźć prostej tabeli, która porównuje wszystkie różne funkcje.

Czy ktoś zna jakąś?

Author: Community, 2015-09-09

3 answers

Proszę zobaczyć załączone zdjęcie użytecznej tabeli funkcji porównujących zbiory i słowniki.

(tabela podsumowuje tę stronę aż do sekcji "wczesne i późne wiązanie". FYI strona zawiera również bardziej szczegółowe informacje na temat korzystania ze słowników)

Podsumowując, zwykle najlepiej jest użyć słownika lub tablicy.

Rozważając użycie kolekcji, bardziej odpowiednie może być użycie tablicy, jeśli rozmiar nie zmienia się lub zmienia się tylko rzadko. W w tym przypadku tablica może być bardziej wydajna niż kolekcja, ponieważ tablice są bardzo wydajne do wypełniania i pobierania wszystkich elementów jednocześnie (np. range to array i array back To range).

Uwaga również:

W porównaniu do tablic, Kolekcje oferują dobrą wydajność dodawania i wstawiania elementów oraz uzyskiwania dostępu i usuwania ich za pomocą kluczy. Jednak wydajność jest słaba, jeśli pozycje mają być dostępne przez indeks. Informacje o tym, jak to zrobić, można znaleźć w tutaj , które również omawia wewnętrzne działanie tych obiektów listy.

Ta strona cpearson ma bardzo przydatny kod do pracy ze słownikami, kolekcjami i tablicami (sortowanie ich, a także konwertowanie ich na siebie!)

Jakiś tekst ze strony cpearsona:

Obiekt Collection i obiekt Dictionary są bardzo przydatne dla przechowywanie grup powiązanych danych. Wszystko inne jest równe, używam Obiekt słownika, a nie Obiekt kolekcji, ponieważ masz dostęp (Odczyt, Zapis, zmiana) do Właściwości Key związanej z Pozycji w słowniku. W dość kiepskiej konstrukcji obiektu klucz element w kolekcji jest tylko do zapisu. Możesz przypisać klucz do elementu po dodaniu elementu do kolekcji, ale nie można pobrać Klucz związany z elementem, ani nie można określić (bezpośrednio), czy klucz istnieje w zbiorze. Słowniki są bardzo przyjazne i otwarte z kluczami. Słowniki są również znacznie szybsze niż Kolekcje.

Dlaczego tablice mogą być złym wyborem. Tablice są znacznie wolniejsze przy zmienianiu rozmiaru i wstawianiu elementów w środku, ponieważ każdy Redim Kopiuje cały blok pamięci w większe miejsce, a jeśli używany jest Preserve, wszystkie skopiowane wartości również. Może to przekładać się na postrzeganą powolność każdej operacji-w potencjalnym zastosowaniu)

Tutaj wpisz opis obrazka

 19
Author: HarveyFrench,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-08 21:48:18
Option Explicit

Sub CollectionsVSdictionaries() ' Requires ref to "Microsoft Scripting Runtime" Library
    Dim c As Collection         ' TypeName 1-based indexed
    Dim d As Dictionary         ' 0-based arrays
    Set c = New Collection      ' or: "Dim c As New Collection"
    Set d = New Dictionary      ' or: "Dim d As New Dictionary"

    c.Add Key:="A", Item:="AA": c.Add Key:="B", Item:="BB": c.Add Key:="C", Item:="CC"
    d.Add Key:="A", Item:="AA": d.Add Key:="B", Item:="BB": d.Add Key:="C", Item:="CC"

    Debug.Print TypeName(c)    ' -> "Collection"
    Debug.Print TypeName(d)    ' -> "Dictionary"

    Debug.Print c(3)            ' -> "CC"
    Debug.Print c("C")          ' -> "CC"
    'Debug.Print c("CC")       ' --- Invalid ---

    Debug.Print d("C")          ' -> "CC"
    Debug.Print d("CC")        ' Adds Key:="CC", Item:=""
    Debug.Print d.Items(2)      ' -> "CC"
    Debug.Print d.Keys(2)       ' -> "C"
    Debug.Print d.Keys()(0)     ' -> "A"    - Not well known ***************************
    Debug.Print d.Items()(0)    ' -> "AA"   - Not well known ***************************

    'Collection methods:
    '    .Add                   ' c.Add Item, [Key], [Before], [After] (Key is optional)
    '    .Count
    '    .Item(Index)           ' Default property;   "c.Item(Index)" same as "c(Index)"
    '    .Remove(Index)
    'Dictionary methods:
    '    .Add                   ' d.Add Key, Item (Key is required, and must be unique)
    '    .CompareMode           ' 1. BinaryCompare     - case-sensitive   ("A" < "a")
    '    .CompareMode           ' 2. DatabaseCompare   - MS Access only
    '    .CompareMode           ' 3. TextCompare       - case-insensitive ("A" = "a")
    '    .Count
    '    .Exists(Key)           ' Boolean **********************************************
    '    .Item(Key)
    '    .Items                 ' Returns full array: .Items(0)(0)
    '    .Key(Key)
    '    .Keys                  ' Returns full array: .Keys(0)(0)
    '    .Remove(Key)
    '    .RemoveAll             ' ******************************************************
End Sub
 10
Author: paul bica,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-09 19:44:47

Option Explicit

Sub UpdateSummary ()

Dim varData
Dim objDicCountry As Object
Dim objDicCity As Object
Dim objDicData As Object
Dim lngR As Long
Dim varResult
Dim lngC As Long
Dim strKey As String
Dim varUnique

varData = Sheet12.Range("A1").CurrentRegion
Set objDicCity = CreateObject("Scripting.Dictionary")
Set objDicCountry = CreateObject("Scripting.Dictionary")
Set objDicData = CreateObject("Scripting.Dictionary")

For lngR = LBound(varData) + 1 To UBound(varData)

    strKey = varData(lngR, 1) '--Country
    objDicCountry.Item(strKey) = ""

    strKey = varData(lngR, 2) '--City
    objDicCity.Item(strKey) = ""

    strKey = varData(lngR, 1) & "|" & varData(lngR, 2) '--Country and City
    objDicData.Item(strKey) = objDicData.Item(strKey) + varData(lngR, 3)

Next lngR

ReDim varResult(1 To objDicCountry.Count + 1, 1 To objDicCity.Count + 1)

varUnique = objDicCountry.keys '--get Unique Country

For lngR = LBound(varUnique) To UBound(varUnique)
    varResult(lngR + 2, 1) = varUnique(lngR)
Next lngR

varUnique = objDicCity.keys '--get Unique City

For lngC = LBound(varUnique) To UBound(varUnique)
    varResult(1, lngC + 2) = varUnique(lngC)
Next lngC


For lngR = LBound(varResult) + 1 To UBound(varResult)
    For lngC = LBound(varResult) + 1 To UBound(varResult, 2)
        strKey = varResult(lngR, 1) & "|" & varResult(1, lngC) '--Country & "|" & City
        varResult(lngR, lngC) = objDicData.Item(strKey)
    Next lngC
Next lngR

Sheet12.Range("F6").Resize(UBound(varResult), UBound(varResult, 2)).Value = varResult
MsgBox "Done", vbInformation

End Sub

 0
Author: rishi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-07 16:27:05