Newsgroup: it.comp.lang.visual-basic
Titolo: Gestione di un insieme ordinato di oggetti

Salve a tutti.
Ho creato una classe Dipendente che raccoglie i dati dei dipendenti di una ditta tra cui Nome, Età, eccetera.
 
Adesso vorrei poter gestire un'insieme di tali oggetti, ordinato per nome dei dipendenti, in modo da poter eseguire la ricerca e l'inserimento nella giusta posizione.
 
Per la sola ricerca potrei usare un semplice array ma per inserire un nuovo dipendente mi toccherebbe ogni volta ridimensionare l'array, trovare la giusta posizione del nuovo dipendente in base al nome e muovere ad uno ad uno gli elementi dell'array che vengono dopo il nuovo dipendente spostandoli di un posto.
 
Chiedevo quindi se in VB.Net esiste una soluzione più valida in termini di prestazioni. Ad esempio il namespace System.Collections contiene un mucchio di classi, ma la documentazione in linea non affronta mai l'argomento prestazioni.
Ho anche provato a cercare qualche esempio con l'API CopyMemory (API che avevo imparato ad usare col VB6), ma per VB.Net non ho trovato niente di utile al mio scopo.
 
Penso che questo argomento sia sicuramente tra i 'ben noti' tra i programmatori, ma stranamente anche sul NG non ho trovato granchè.
Beninteso, in questo specifico caso potrei anche arrangiarmi con una soluzione qualsiasi visto che i dipendenti di una ditta non sono in genere un numero esagerato, però mi piacerebbe conoscere la soluzione generica per eventuali necessità future.


Io ti consiglio di usare una lista tipizzata:
 
Dim ListaDipe as new List(Of Dipendente)
dim oDipe as new Dipendente
oDipe.ID = 1
oDipe.Nome = "Pippo"
oDipe.Cognome = "xx"
ListaDipe.Add(oDipe)
 
 
La List(Of T) ha metodi per l'ordinamento (Sort) e la ricerca (Find).
 
Per selezionare un dipendente della lista puoi usare anche LINQ con 
qualcosa del genere
 
Dim oDipe As Dipendente = (From d As Dipendente In ListaDipe Where d.ID 
= 1).FirstOrDefault
 
 
La List(Of T) latrovi nel namespace System.Collections.Generic e ha 
prestazioni molto buone proprio perchè facendo parte dei Generics non ha 
bisogno di fare Boxing e Unboxing
 
Documentazione su quale contenitore di dati usare ne trovi quanta ne 
vuoi cercando ad esempio: "list vs hashtable vs dictionary" ma devi 
sempre valutare caso per caso in base alle tue necessità.
 
Ad esempio, se l'esigenza di ordinare la puoi demandare al presentation 
layer e non hai tantissimi dati puoi usare un Hashtable che ti da la 
possibilità di accedere per chiave alla collection ed è molto prestazionale.
 
 
Ciao, Vincenzo
 

 Salve a tutti.
zac
in genere i generics (ho fatto pure il gioco di parole) una volta 
compilati sono MOLTO più veloci delle versioni built-in!...anche di 
parecchio!
 
 
quindi...ad esempio ... la versione generica di SortedList
 
http://msdn.microsoft.com/it-it/library/ms132319.aspx
 
 
 
attenzione che per ORDINARE....devo poter mettere in relazione 2 oggetti 
per poter STABILIRE CHI viene PRIMA e chi DOPO!
 
Per questo su OGGETTI hai bisogno di implementare IComparer (i tipi 
standard lo fanno di default...ma la classe DIPENDENTE net non sà di 
default come trattarla per stabilire quale istanza viene prima di un altra)
 
Ovviamente proseguiamo nei GENERICS
Come implementare un IComparer(Of T)
http://msdn.microsoft.com/it-it/library/8ehhxeaf.aspx
 
 
Ciao!....buon divertimento (una volta presa la mano sta roba è pure 
divertente e si capisce l'abisso con vb6!)

 Chiedevo quindi se in VB.Net esiste una soluzione più valida in termini di prestazioni. Ad esempio il namespace System.Collections contiene un mucchio di classi, ma la documentazione in linea non affronta mai l'argomento prestazioni.
 
 
Sotto la namespace System.Collections.Generic trovi alcune implementazioni di albero binario che potrebbero essere utili al tuo scopo, in particolare:
 
http://msdn.microsoft.com/en-us/library/ms132319%28v=vs.80%29.aspx
 
 
In basso c'è anche un paragrafo che compara SortedList a SortedDictionary proprio in termini di prestazioni; internamente la SortedList fa proprio la copia degli array stile CopyMemory quando necessario (cosa che peraltro puoi accedere nativamente con Array.Copy)
 

 On 21/06/2012 20:58, antologiko wrote:
mi son dimenticato di specificare..
 
..leggi bene l'help di SortedList ed Icomparer...ci sono tante TIP che 
vanno "scoperte"
 
 

Grazie dei suggerimenti ragazzi, comincio subito ad approfondire le List, SortedList, HashTable e similari.