7 messaggi dal 07 maggio 2012
Quando cambio il bitArray associato ad una specifica chiave del dizionario cambia anche i bitArray associati a tutte le altre chiavi.

Riporto il programma di esempio in vb net:
-----------------------------------------------------------------------
Imports System.Collections.Specialized
Module Module1


Sub Main()
Dim list As New Dictionary(Of String, BitArray)
Dim bit As New BitArray(4, False)

list.Add("A1", bit)
list.Add("A2", bit)

For Each kvp As KeyValuePair(Of String, BitArray) In list
For i = 0 To list.Count - 1
Console.WriteLine(kvp.Key & " - " & kvp.Value(i).ToString)
Next
Next kvp

bit(0) = True
list("A1") = bit

For Each kvp As KeyValuePair(Of String, BitArray) In list
For i = 0 To list.Count - 1
Console.WriteLine(kvp.Key & " - " & kvp.Value(i).ToString)
Next
Next kvp

End Sub

End Module
-----------------------------------------------------------------------
L'output prima di cambiare il contenuto della chiave A1 e' il seguente:
A1 - False
A1 - False
A2 - False
A2 - False

Dopo aver cambiato il valore della chiave A1 ho il seguente output:
A1 - True
A1 - False
A2 - True
A2 - False

Dove sbaglio?
Grazie in anticipo.
11.857 messaggi dal 09 febbraio 2002
Contributi
Ciao Antonio,
grazie per l'esempio, così il problema è chiaro.

antonio1950 ha scritto:

cambia anche i bitArray associati a tutte le altre chiavi.

Sì, capita questo perché entrambi gli elementi del dizionario puntano allo stesso BitArray. Anche se hai aggiunto due chiavi, il relativo valore è sempre lo stesso BitArray che si trova sulla medesima area di memoria.

Guarda questo codice:
list.Add("A1", bit)
list.Add("A2", bit)

Hai usato la variabile bit in entrambe le istruzioni. Il dizionario ammette che vi siano valori duplicati, quindi non hai avuto errori (l'importante è che le chiavi siano uniche).

Ora, la prima cosa che di solito si tenta di fare è questa:
Dim bit As New BitArray(4, False)
Dim bit2 As BitArray = bit
list.Add("A1", bit)
list.Add("A2", bit2)

In realtà, neanche questo funzionerà perché sia bit che bit2 continueranno a puntare allo stessa istanza di BitArray, quella che avevi creato grazie alla parola chiave New.

La vera soluzione consiste nel creare una seconda istanza di BitArray, oppure di clonare il primo BitArray, in modo che ne venga posta una seconda copia in memoria, che sarà indipendente dalla prima. Ecco un esempio con il metodo Clone.
list.Add("A1", bit)
list.Add("A2", bit.Clone())


Un'altra cosa...
For Each kvp As KeyValuePair(Of String, BitArray) In list
  For i = 0 To list.Count - 1
Come mai fai due cicli annidati sullo stesso dizionario? Forse con il for più interno intendevi ciclare i bit del BitArray?
For Each kvp As KeyValuePair(Of String, BitArray) In list
  For i = 0 To kvp.Value.Count -1


ciao,
Moreno
Modificato da BrightSoul il 11 giugno 2014 22.56 -

Enjoy learning and just keep making
7 messaggi dal 07 maggio 2012
Grazie Moreno per la risposta.

Il problema reale prevede la necessità di eseguire enne elaborazioni diverse su ogni singolo elemento di una tabella e sapere alla fine, per ogni singolo elemento, quali elaborazioni sono andate a buon fine e quali elaborazioni non sono state completate.

Poichè gli elementi della tabella non sono più di una ventina avevo pensato di utilizzare un dizionario del tipo Dictionary(Of TKey, TValue) dove la chiave rappresenta l'identificativo dell'elemento e il valore (rappresentato da una bitArray) mi riporta su ogni singolo bit lo stato della elaborazione associata al bit.

Ho risolto il problema sostituendo alla bitArray una semplice stringa dove ogni singolo carattere della stringa mi rappresenta lo stato della elaborazione associa al carattere.

Per quanto riguarda la tua domanda "Come mai fai due cicli annidati sullo stesso dizionario? Forse con il for più interno intendevi ciclare i bit del BitArray?" la risposta è si.

Grazie e ciao

Antonio

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.