Newsgroup: it.comp.lang.visual-basic
Titolo: [VB.NET 2003] Confronto in ArrayList

Sto convertendo gli array in arraylist e mi trovo uno scoglio nella 
StrComp, che serve a confrontare due valori.
A me serve verificare se un campo inserito in una textbox è presente in 
un arraylist.
Con un array faccio:
Dim a As Short
a = StrComp(textbox1.Text, array1(0), CompareMethod.Text)
ma se sostituisco l'array con l'arraylist mi dà errore.
C'è un altro modo per confrontare una textbox con gli elementi inclusi 
in un arraylist?
Christian

 a = StrComp(textbox1.Text, array1(0), CompareMethod.Text)
Questo si scriverebbe
Dim a As Integer
a = String.Compare(textbox1.Text, array1(0).ToString(), true)
Ma credo che quello che serva a te sia
Dim a As Integer
a = array1.IndexOf(textbox1.Text)
Facendo attenzione che IndexOf non è case-sensitive.
Ciao
-- 
Free .Net Reporting Tool - 
http://www.neodatatype.net
 

 a = String.Compare(textbox1.Text, array1(0).ToString(), true)
Grazie per l'indicazione, ho corretto tutto il mio codice con il tuo 
consiglio (però anche qua usi Integer invece che Short).
Christian

 - per ignorare le maiuscole/minuscole?
Credo che IndexOf si basi su IComparable come le altre funzioni di 
comparazione, quindi o ti costruisci una piccola classe che implementa 
IComparable in modo da ignorare le maiuscole in un confronto, gli assegni la 
stringa che ti interessa e poi aggiungi questa tua classe alla lista, oppure 
se non č un problema nella lista semplicemente salvi tuaStringa.ToLower() e 
poi cercherai tuaStringa.ToLower().
Oppure ancora ti fai il tuo bel loop e te la cerchi a mano :)
Ciao 

 Oppure ancora ti fai il tuo bel loop e te la cerchi a mano :)
Quale dei tre metodi è più veloci in fase di esecuzione del programma?
E c'è tanta differenza?
Christian

 E c'è tanta differenza?
Provali! :)
Ma credo proprio che il secondo sia decisamente il più veloce oltre che il 
più chiaro.


 Oppure ancora ti fai il tuo bel loop e te la cerchi a mano :)
Ho optato per una quarta possibilità, dimmi che ne pensi:
- faccio controllo arraylist (quindi senza possibilità di distinguere 
tra maiuscole e minuscole);
- se lo passa, trasformo l'arraylist in array;
- tramite un ciclo for controllo tutti i campi dell'array col 
String.Compare, quindi anche maiuscole/minuscole;
- poichè lo becco sempre, lo faccio uscire dal sub.
Com'è come soluzione?
Christian

 Com'è come soluzione?
Non credo di aver capito, ma penso che sia un lavoro inutile.
Ciao 

 Com'è come soluzione?
vedo un ciclo e relative comparazioni piu` un'allocazione di memoria 
di troppo.
-- 
ciao, hal

hal1961 says...

Potrei poi cancellare l'array per non utilizzare memoria inutilmente.
Hai altri accorgimenti, magari migliori?
Christian

Fabio says...

Te lo spiego meglio: la mia idea è quella di verificare se ci sono già 
record presenti con lo stesso nome nell'arraylist, ma non si può fare 
ignorando maiuscole/minuscole, invece con l'array si può con lo 
string.compare, quindi trasformo l'arraylist in array e faccio il 
confronto.
Come ti sembra come soluzione?
Christian

 Potrei poi cancellare l'array per non utilizzare memoria inutilmente.
la mia osservazione riguarda la doppia allocazione per arraylist 
ed array e spreco di cicli di cpu per un doppio loop.
vabbe' che l'hardware lo paga il cliente... (microsoft docet)
-- 
ciao, hal

 confronto.
Usa un'Hashtable anzichè un'ArrayList, usi la tua chiave come chiave 
primaria (in minuscolo) e i dati come dato.
Per controllare che la chiave esista basta verificare se la stringa 
minuscola è presente nell'Hashtable.
Ciao 

Fabio says...

Vediamo se ho capito.
L'utente inserisce 3 dati da memorizzare: AA, BB e CC.
Creo un hashtable di due campi, in uno metto la chiave minuscola:
aa
bb
cc
Nell'altro campo il dato reale:
AA
BB
CC
Se ho capito bene, in questo caso mi sorgono due considerazioni:
- la memoria occupata è doppia rispetto ad un arraylist;
- converto eventuali maiuscole subito dopo l'inserimento del dato da 
parte dell'utente, ma se la hashtable memorizza i dati come generici 
tipo oggetto, proprio come l'arraylist, suppongo che nella Hashtable la 
conversione maiuscolo/minuscolo sia possibile, altrimenti il gioco non 
vale la candela.
Spero d'essere stato chiaro.
Christian

hal1961 says...

Se hai una soluzione migliore, te ne sarei grato se me la indicassi.
Christian

 Se hai una soluzione migliore, te ne sarei grato se me la indicassi.
non sono obbligato a farlo.
dai un'occhio all'altro ramo del thread, comunque.
-- 
ciao, hal

 Spero d'essere stato chiaro.
Allora, ti stai facendo delle pippe mentali inutili.
Quella dell'hashtable è la mia soluzione a costo zero.
Se cerchi qualcosa di meglio devi costruirti una tua lista personalizzata, 
dove attraverso IComparable come ti indicavo all'inizio.
Il gioco ne vale la candela?
Secondo me no, primo perchè ti devi studiare tutto il discorso sulle 
collezioni custom, su IComparer e IComparable e secondo, le prestazioni 
decadrebbero sicuramente poichè per quanto ben fatta la tua implementazione 
sarà più lenta del compilato managed, che diciamolo, non è ancora un granchè 
ottimizzato.
Ciao

Fabio says...

Chiarissimo, grazie.
Christian