6 messaggi dal 01 maggio 2016
Ciao a tutti,
sto iniziando a sperimentare gli oggetti, seguendo il capitolo 4 del libro Visual Basic 2015.
Ho creato una classe "BollettiniMETEO" ed una lista di oggetti di quella classe.
Questa classe ha 3 property che vengono definiti contemporaneamente in una sub, che si attiva al click di un button:

Dim BOLLETINI As New List(Of BollettiniMETEO)

Dim bollettino As New BOLLETTINI With {.Città = TextBox1.Text, .Temperatura = TextBox2.Text, .Pressione = TextBox3.Text}
BOLLETTINI.add(Bollettino)


In pratica crea un nuovo oggetto e lo inserisce niella lista, avrei necessità di inserirli in lista solo e soltanto nel caso in cui non ci sia un doppione.
Ho provato a fare

If not BOLLETTINI.contain(Bollettino) then BOLLETTINI.add(Bollettino)


Ma mi inserisce sempre l'oggetto in lista, in pratica se premo 3 o 4 volte il button, lo inserisce tutte le volte che lo premo.

Come posso far in modo di inserirlo una volta soltanto (se gia è presente)????????

Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Gina, benvenuta nel forum!


lo inserisce tutte le volte che lo premo.

E' normale che ciò succeda. Infatti, quando invochi il Contains, quale criterio potrebbe usare la lista per determinare se un oggetto era già presente? In base in valore della Città? In base alla Temperatura e/o alla Pressione? In base al valore di tutte e tre le proprietà? E perché adottare una scelta anziché l'altra?

Siccome non hai esplicitamente indicato una logica secondo la quale le tue istanze della classe BollettiniMETEO devono essere considerate "uguali", allora la lista adotterà il metodo di confronto di default, che è quello per riferimento.
Ovvero: se si tratta della medesima istanza, allora il .Contains restituirà True, altrimenti False.
Però, dato che tu stai creando ogni volta una nuova istanza con la parola chiave New, allora il Contains non potrà mai restituire True.

Lo trovi spiegato nella documentazione MSDN del metodo Equals che tutti gli oggetti possiedono e che viene invocato internamente dal Contains per determinare l'uguaglianza.
https://msdn.microsoft.com/it-it/library/bsc2ak47(v=vs.110).aspx
In particolare si legge:

If the current instance is a reference type, the Equals method tests for reference equality [...] Reference equality means that the object variables that are compared refer to the same object.


Quello che puoi fare, dunque, è l'Override del metodo Equals per ridefinire esplicitamente la logica secondo la quale due istanze devono essere considerate uguali.
Qui trovi un altro articolo su MSDN che ti spiega come fare:
https://msdn.microsoft.com/it-it/library/336aedhh(v=vs.100).aspx

L'articolo spiega che devi anche fare l'Override del metodo GetHashCode, che diventerà importante fra poco, quando useremo un tipo di lista, la HashSet, che ti garantisce che al suo interno non ci siano doppioni.

Guarda questo esempio in cui ho fatto l'Override di Equals e di GetHashCode della classe BolletinoMeteo. La logica che ho scelto di usare è quella di reputare due istanze uguali solo se è uguale la loro città, non coinvolgendo quindi i valori di Temperatura e Pressione nel confronto.
https://dotnetfiddle.net/0cBLLC

Nota anche come le varie istanze di BollettinoMeteo siano state aggiunte ad una collezione di tipo HashSet(Of BollettinoMeteo). Non ho dovuto usare il Contains perché questo tipo di collezione fa già tutto da sé. Bisogna solo chiamare l'Add e l'oggetto verrà effettivamente inserito solo se non esisteva già.
Il metodo Add restituisce un Boolean, nel caso tu voglia sapere se l'oggetto è stato effettivamente inserito o meno.

L'altra cosa da notare è che ho reso la proprietà Città immodificabile per evitare che potesse essere alterata DOPO l'inserimento nell'HashSet, di fatto aggirando i controlli interni della collezione.

Dato che la proprietà Città è marcata come ReadOnly, non sarà possibile modificarne il valore dopo che l'oggetto BollettinoMeteo è stato costruito. L'unico e solo modo che hai di impostarla, quindi, è di indicarla come parametro del costruttore.
Nella mia implementazione, le altre proprietà Temperatura e Pressione possono continuare ad essere modificate a piacimento anche dopo la costruzione, dato che comunque non intervengono nella logica di confronto.

ciao,
Moreno
Modificato da BrightSoul il 05 maggio 2016 22.53 -

Enjoy learning and just keep making
6 messaggi dal 01 maggio 2016
Grazie,
appena ho un attimo libero lo provo

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.