Spiegazioni sulluso di Dictionary




  • di scossa (utente non iscritto) data: 16/04/2014 22:23:11

    cit. lepat: "... non riesco a capire la linea If e <> "" Then dic(e) = dic(e) + 1 "

    Non so se ho capito bene qual'è il tuo dubbio, comunque ci provo.

    Intanto bisogna precisare che la sintassi dic(e) è la forma abbreviata di dic.item(e)
    L'istruzione

    • - se la chiave e non esiste nel dizionario, allora viene aggiunta ed il valore del rispettivo item viene incrementato di 1

    • - se la chiave e esiste già nel dizionario, allora il valore del rispettivo item viene incrementato di 1


    Ricordo che, in un oggetto della classe Dictionary, la chiave (key) è univoca.


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di scossa data: 16/04/2014 22:31:20

    Esprimo meglio:

    L'istruzione opera in due modi diversi, in dipendenza dell'esistenza o meno della chiave nel dizionario:
    • - se la chiave e non esiste nel dizionario, allora la chiave viene aggiunta ed il valore del rispettivo item viene incrementato di 1
    • - se la chiave e esiste già nel dizionario, allora il valore del rispettivo item viene incrementato di 1



    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di lepat (utente non iscritto) data: 17/04/2014 07:40:47

    grazie scossa, già la precisazione che la sintassi dic(e) è la forma abbreviata di dic.item(e) mi chiarisce un po' di più, comunque duro fatica a capire completamente, è possibile riscrivere il codice in modo meno compatto ma più comprensibile ? possono essere usate alternative al metodo item ?



  • di scossa data: 17/04/2014 09:30:30

    cit. lepat: " ... è possibile riscrivere il codice in modo meno compatto ma più comprensibile ?"

    Premessa: al contrario della classe Collection per la quale la chiave è facoltativa, nella classe Dictionary la chiave è obbligatoria, quindi non possono esserci valori duplicati.
    Questo significa che se si applica il metodo .Add per aggiungere una chiave, bisogna preventivamente sincerarsi che quellla chiave non esista già.

    Il codice sotto dovrebbe essere sufficientemente "prolisso":


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

     
    Sub conta2() ' nel foglio 1
        Dim myDir As String, fn As String, dic As Object
        Dim a As Variant, e As Variant
        Set dic = CreateObject("Scripting.Dictionary")
        
        dic.CompareMode = TextCompare
        With Sheets(1)
            a = .Range("a1", .Range("a" & Rows.Count).End(xlUp)).Value
        End With
        If IsArray(a) Then
          For Each e In a
            If e <> "" Then                 
              If Not dic.Exists(e) Then       'se la chiave e non esiste già
                dic.Add Key:=e, Item:=0         'aggiungi un elemento a Dic con key e ed item 0
              End If
              dic.Item(e) = dic.Item(e) + 1   'se la chiave esiste assegna all'item con chiave e un nuovo valore
            End If
          Next
        End If
        Sheets(1).Cells(3).Resize(dic.Count, 2).Value = _
        Application.Transpose(Array(dic.keys, dic.Items))
        Set dic = Nothing
    End Sub
    



  • di Grograman (utente non iscritto) data: 17/04/2014 10:58:02

    Non so a cosa mai potrà servirmi, ma mi sto studiando i vostri codici
    Sopratutto perchè ho visto che la mia libreria preferita ha al suo interno l'oggetto "Dictionary"

    Devo solo capire bene come utilizzare/distinguere items e keys
     
    Sub Conta_Library()
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ''''' ATTENZIONE RICHIEDE L'ATTIVAZIONE DELLA LIBRERIA MICROSOFT SCRIPTING RUNTIME '''''
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '' Per l'attivazione andare su "Strumenti", "Riferimenti", cercare e spuntare il nome ''
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
      Dim oDic As Dictionary
      Dim vDati As Variant, vEl As Variant
      Set oDic = New Dictionary
      
      With Worksheets(1)
        vDati = .Range("a1", .Range("a" & .Rows.Count).End(xlUp)).Value
      End With
      
      With oDic
      
        .CompareMode = TextCompare 'h t t p :/ /ms dn. mic rosoft.com/ en-us /library/office/gg278481(v=office.15).aspx
       
        For Each vEl In vDati
          If vEl <> "" Then
            If Not .Exists(vEl) Then
              .Add vEl, 0
            End If
            .Item(vEl) = .Item(vEl) + 1
          End If
        Next vEl
        
        Worksheets(1).Cells(1, 3).Resize(.Count, 1) = Application.Transpose(.Keys)
        Worksheets(1).Cells(1, 4).Resize(.Count, 1) = Application.Transpose(.Items)
        
      End With
      Set oDic = Nothing
    End Sub



  • di lepat (utente non iscritto) data: 17/04/2014 12:22:35

    grazie scossa, ci avevo provato anch'io ma mi mancava
     
              dic.Item(e) = dic.Item(e) + 1 



  • di lepat (utente non iscritto) data: 17/04/2014 12:29:42

    cit.
    Non so a cosa mai potrà servirmi .....

    l'uso di dictionary non è essenziale, ma ma se provi a risolvere in altro modo ti accorgi che ti occorre un codice più lungo, il problema è che non è proprio un metodo intuitivo.



  • di Grograman (utente non iscritto) data: 17/04/2014 13:26:17

    Quindi tu lo usi ad esempio in sostituzione di una collection per avere un elenco univoco?
    Ad esempio per alimentare combobox e simili?



  • di scossa data: 17/04/2014 13:52:53

    cit.: "Quindi tu lo usi ad esempio in sostituzione di una collection per avere un elenco univoco?"

    Esatto, rispetto alla Collection è più performante, anche se - al contrario della classe Collection che è nativa - richiede un riferimento (early binding o late binding) alla libreria di Scripting.



    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di Grograman (utente non iscritto) data: 17/04/2014 14:33:51

    Grazie come al solito

    A questo punto finisce dritto dritto nei codici degli appunti e alla prima occasione utile lo risplovero e riciclo!