PDA

View Full Version : [c#]Help con list


pmhwp
18-03-2008, 17:38
Ciao,
ho una classe cosi composta:
class soggetto{
.. metodo lettura dati

protected int id;
protected string nome;
protected string cognome;
protected string email;
protected string telefono;

}

Ora durante l'esecuzione del programma creo una lista di tipo soggetto:
List<client> clientList=new List<client>();

La mia domanda è questa:
Come faccio ad accedere direttamente a un campo della lista e piu precisamente a uno dei campi del record(nome , cognome email o telefono) ?

Posso accedere per ogni elemento della lista a un metodo di tipo soggetto?

Grazie.

Gremo
19-03-2008, 00:59
Se ho capito vuoi qualcosa del genere:


Iterator it = clientList.iterator()

while (it.hasNext())
{
soggetto current = (soggetto) it.next();
System.out.println(s.nome);
}


Non sono sicurissimo che sia necessario il cast, aspettiamo qualche esperto ;)

edit: credo che non sia necessario, dai un occhiata qui:

http://www.particle.kth.se/~lindsey/JavaCourse/Book/Part1/Java/Chapter10/generics.html

gugoXX
19-03-2008, 01:25
Ciao,
ho una classe cosi composta:
class soggetto{
.. metodo lettura dati

protected int id;
protected string nome;
protected string cognome;
protected string email;
protected string telefono;

}

Ora durante l'esecuzione del programma creo una lista di tipo soggetto:
List<client> clientList=new List<client>();

Perche' dici di creare una lista di tipo soggetto e poi invece crei una Lista di tipo client?
Che relazione c'e' tra client e soggetto?


La mia domanda è questa:
Come faccio ad accedere direttamente a un campo della lista e piu precisamente a uno dei campi del record(nome , cognome email o telefono) ?

Posso accedere per ogni elemento della lista a un metodo di tipo soggetto?

Grazie.

Un campo della lista lo prendi come ha scritto Gremo, oppure direttamente dall'indice:
clientlist[15]

Pero' i campi che hai scritto sopra sono protected, non sono visibili dall'esterno (Non e' un problema di lista)
O li rendi pubblici oppure meglio ancora gli esponi ciascuno mediante una proprieta.
Se per esempio email fosse pubblica, o fosse esposta mediante una proprieta' pubblica, allora potresti scrivere

clientlist[15].email;

pmhwp
19-03-2008, 18:01
Perche' dici di creare una lista di tipo soggetto e poi invece crei una Lista di tipo client?
Che relazione c'e' tra client e soggetto?


E' un mio errore di battitura...volevo scrivere soggetto.

Quindi la meglio secondo voi sarebbe quella di renderli pubblici...
Mettendo il caso che questi attributi fossero protected invece come potrei accedere a un campo di un record della lista?Con un metodo appartenente alla classe soggetto?

Gremo
19-03-2008, 18:27
E' un mio errore di battitura...volevo scrivere soggetto.

Quindi la meglio secondo voi sarebbe quella di renderli pubblici...
Mettendo il caso che questi attributi fossero protected invece come potrei accedere a un campo di un record della lista?Con un metodo appartenente alla classe soggetto?

no la soluzione migliore è che siano privati con metodi accessori...
è un famoso "refactoring", ossia una tecnica per riscrivere codice più comprensibile e ordinato...
http://www.refactoring.com/catalog/encapsulateField.html

pmhwp
19-03-2008, 22:30
Appunto,quindi pero' se creo una lista della classe soggetto,quando la scorro come faccio ad accedere al campo nome per esempio?

Cosi lista[i].metodolettura(); ?

gugoXX
19-03-2008, 22:34
Appunto,quindi pero' se creo una lista della classe soggetto,quando la scorro come faccio ad accedere al campo nome per esempio?

Cosi lista[i].metodolettura(); ?

Quello e' un modo.
Meglio pero' usare le proprieta'


public classe pippo
{
protected int i_altezza;

public int Altezza
{
get
{
return i_altezza;
}
}
}


potrai fare qualcosa tipo
int hhh=lista[i].Altezza;
Come se Altezza fosse una variabile normale.
Invece e' una proprieta', in questo caso di sola lettura, il cui valore e' quello della tua variabile protetta i_altezza.

pmhwp
19-03-2008, 23:06
Quello e' un modo.
Meglio pero' usare le proprieta'


public classe pippo
{
protected int i_altezza;

public int Altezza
{
get
{
return i_altezza;
}
}
}


potrai fare qualcosa tipo
int hhh=lista[i].Altezza;
Come se Altezza fosse una variabile normale.
Invece e' una proprieta', in questo caso di sola lettura, il cui valore e' quello della tua variabile protetta i_altezza.

Posso farlo anche se le variabili sono private?

Grazie ancora.

gugoXX
19-03-2008, 23:20
Posso farlo anche se le variabili sono private?

Grazie ancora.

Certo.
Le proprieta' get e set sono membri della classe.
Come tali possono fare tutto quello che fanno i membri di una classe, compreso leggere o scrivere le variabili private.
Ti consiglio di leggere qualche paragrafo relativo al concetto di visibilita' nel paradigma ad oggetti. Almeno public, protected e private sono presenti quasi dappertutto con quasi gli stessi significati.
http://msdn2.microsoft.com/en-us/library/ba0a1yw2(VS.71).aspx