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).aspxIn 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).aspxL'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/0cBLLCNota 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 -