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ąś?
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)
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
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
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