Newsgroup: it.comp.lang.visual-basic
Titolo: [vb.net] Da matrice ad arraylist

Sto  convertendo tutte le matrici che è il caso di convertire in 
arraylist, e mentre per le matrici unidimensionali non ho nessun 
problema, lo trovo per quelle bidimensionali.
Se per la matrice si fa semplicemente: Dim a(,) as String, googlando un 
pò ho visto che per l'arraylist si possono utilizzare varie tecniche, ma 
poichè non sono un esperto decennale di vb, vorrei trovare un metodo 
semplice, poi col tempo, e se sarà il caso, li sostituirò con modelli 
più complessi.
Un modo semplice per creare e dimensionare un arraylist bidimensionale 
è:
Dim a As New Arraylist
a.Add(New String(2) {})
a(0) (0) = "prova0"      'riempimento arraylist
Non sarà allo stato dell'arte della programmazione, ma per il mio 
livello di programmazione è sufficiente, al momento.
La domanda che volevo fare è questa: perchè non funziona il metodo 
.IndexOf?
Mi spiego con due esempi.
Arraylist monodimensionale:
Dim a1 As New Arraylist
Dim b As Integer
a1.Add("prova0")
a1.Add("prova1")
a1.Add("prova2")
b = a1.IndexOf("Prova2")
b=2 è il corretto risultato.
Arraylist bidimensionale:
Dim a2 As New Arraylist
Dim b As Integer
a2.Add(New String(2) {})
a(0) (0)= "prova0"
a(1) (0)= "prova1"
a(2) (0)= "prova2"
b = a2.IndexOf("Prova2")
b=-1 perchè la ricerca non va a buon fine.
Quale può essere una soluzione per far funzionare .IndexOf nell'ultimo 
esempio indicato?
Christian

 esempio indicato?
Anzichè usare un array bidimensionale usa una Structure che è un value type 
(finchè non ha tipi complessi come membri) oppure ti fai una tua classe che 
implementa IComparable e assegni quella.
Ciao
-- 
Free .Net Reporting Tool - 
http://www.neodatatype.net
 

 implementa IComparable e assegni quella.
Già le conosco un pò, ma mi sembrano più complesse da gestire rispetto a 
quello che ho proposto io. In ogni caso, quando utilizzare la Structure 
e quando la classe?
Christian

 la Structure e quando la classe?
Fondamentalmente, le strutture sono dei value type, mentre le classi sono 
reference type e questo, di per se, vuol dire che le prime sono 
memorizzate nello stack, mentre le seconde nello heap...
Comunque, le similitudine e, al contempo, le differenze, sono molte:
"Visual Basic Language Concepts - Structures and Classes"
http://msdn.microsoft.com/library/en-us/vbcn7/html/vaconstructuresandclasses.asp
Ciao!
-- 
Gianluca Cannalire
Microsoft MVP/MCP - Visual Basic
http://www.visual-basic.it
http://community.visual-basic.it/gianluca
 

Credo che per il mio caso sia preferibile la classe.
É corretta costruirla così?
(creazione in un nuovo elemento class.vb) (dati scritti solo come 
esempio)
Public Class Class1
   Private _Contatore As Integer
   Private _Nome As String
Public Sub New (ByVal contatore As Integer, ByVal nome as String)
   Me.Contatore = contatore
   Me.Nome = nome
Public Property Contatore() As Integer
   Get
      Return Me._Contatore
   End Get
   Set (ByVal Value As Integer)
      Me._Contatore = value
   End Set
End Property
Public Property Nome() As Integer
   Get
      Return Me._Nome
   End Get
   Set (ByVal Value As Integer)
      Me._Nome = value
   End Set
End Property
Per inserire un nuovo dato:
Dim c As Arraylist
c.Add(New Class1(Cont, TextBox1.Text)
Se fosse una classe corretta, faccio però difficoltà ad utilizzare 
.IndexOf per ricercare un dato all'interno della classe.
Christian

 o se sono value types.
Oppure trasferisco i dati in una matrice, faccio il confronto e poi li 
ritrasferisco al loro posto: troppo lento se ci sono tanti dati oppure è 
fattibile?
Christian

 .IndexOf per ricercare un dato all'interno della classe.
Perchè non inplementa IComparable e quindi IndexOf confronta i puntatori 
della classe interna e di quella passata e non i dati contenuti.
Però a questo punto a me viene un grosso dubbio: sicuro che a te serva 
questo e che non sia invece il caso di utilizzare un Hashtable che usa una 
chiave di ricerca per ogni elemento, che nel tuo caso potrebbe essere, per 
farla breve, Nome & Count.
Ciao 

 farla breve, Nome & Count.
La differenza tra arraylist e hashtable sta tutta nella capacità del 
secondo di ricercare in modo più efficiente i dati inseriti tramite 
chiave, o c'è dell'altro? Perchè visto così l'hashtable è nettamente 
superiore all'arraylist...

 superiore all'arraylist...
Sostanzialmente sì.
L'hashtable ha una lista di chiave/valore e la ricerca avviene con la chiave 
in modo molto più efficiente che su un'ArrayList.
L'ArrayList è solo una lista che assomiglia molto più a un array normale con 
la possibilità di aggiungere e rimuovere elementi dinamicamente.
Nessuno è migliore dell'altro, dipende da cosa serve di volta in volta.
Tieni conto che ad es. un ArrayList può essere ordinato e l'ordine di 
inserimento è rispettato durante lo scorrimento, un'Hashtable no, proprio 
perchè quello che decide l'ordine di scorrimento è la chiave (anzi, 
l'algoritmo di hashing sulla chiave).
Ciao 

 l'algoritmo di hashing sulla chiave).
Chiarissimo, grazie.
Christian