475 messaggi dal 11 febbraio 2013
scusate ma non riesco a capire come implementare l'interfaccia per una classe generic cosi

 class ListaGeneric <T> : IComparable<T>
    {
        private T[] elements;
       
        public ListaGeneric(int len)
        {
         this.elements = new T[len];
        }        
}


come implemento ?

public void Sort<T>(T[] elements) where T:IComparable

sono un po confuso

grazie
10.286 messaggi dal 09 febbraio 2002
Contributi
Ciao,
l'interfaccia IComparable ti chiede di implementare il seguente metodo nella tua classe:

public int CompareTo(T other)
{
//...
}


Vedi che il metodo CompareTo deve restituire un int. Per avere un'idea del significato di quell'int, puoi vedere la documentazione che dice:
Confronta l'istanza corrente con un altro oggetto dello stesso tipo e restituisce un numero intero che indica se l'istanza corrente precede, segue, oppure si trova nella stessa posizione nell'ordinamento rispetto all'altro oggetto.

Se leggi anche il paragrafo successivo viene spiegato che, ad esempio, se restituisci un valore minore di zero (es. -1) allora quella sarà un'indicazione che l'istanza corrente di T deve essere posizionata prima dell'oggetto che ti viene passato come argomento. Utile in situazioni in cui devi ordinare oggetti in una lista, come credo debba fare tu.

Il punto però è questo: dato che la tua ListaGeneric è, per l'appunto, generica, come fai a dire se un'istanza di T viene prima o dopo un'altra istanza di T?

Forse ti conviene implementare un metodo Sort come quello di List<T>?
https://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs,947

ciao,
Moreno

Enjoy learning and just keep making
475 messaggi dal 11 febbraio 2013
Grazie
conosco IComparable e lo implemento facilmente in una classe
ma in una collezione T non riuscivo a capire come fare

In effetti come dici non posso sapere quale oggetto passerà come T.

Quindi mi suggerisci di implementare IComparer?
Modificato da jjchuck il 01 dicembre 2017 15.35 -
475 messaggi dal 11 febbraio 2013
Perdono maestro
riformulo
non è un problema di interfaccia

tuttavia non ho ben capito il metodo che usa List<T>...
10.286 messaggi dal 09 febbraio 2002
Contributi

conosco IComparable e lo implemento facilmente in una classe
ma in una collezione T non riuscivo a capire come fare

Il fatto è che IComparable non lo dovresti implementare in una collezione, a meno che tu non debba ordinare una lista di liste.
Quindi, facciamo un passo indietro: spiega bene cosa devi realizzare.

ciao,
Moreno

Enjoy learning and just keep making
475 messaggi dal 11 febbraio 2013
ciao Moreno
In questo caso non debbo fare nulla perchè sto solo studiando un testo e per ogni paragrafo mi faccio un po di codice per fissare in mente i concetti ...leggere e basta non mi serve a molto (almeno parlo per le mie modestissime capacità)

In un paragrafo sui metodi generici (utili per rendere generico non un tipo ma un algoritmo) l'autore lascia al lettore come esercizio l'implementazione di un metodo
cosi
public void Sort<T>(T[] elements) where T: IComparable
{
//
}

subito prima scrive "anche per i metodi è possibile definire vincoli...per esempio il metodo seguente può implementare l'ordinamento degli elementi di un array confrontandoli, quindi il tipo di tali elementi dovrà implementare l'interfaccia Icomparable..."

cosi ho iniziato a scrivere una classe come sopra... cosi per capire tutto qua

ps: perchè mi dici che IComparable è solo per liste di liste?

cioè se faccio cosi sbaglio?
class Persona: IComparable
{
public string Nome {...}
public int CompareTo(object obj){
if(obj is Person){
  Persona p = obj as Persona;
retuern this.Nome.CompareTo(p.Nome);
}
return -1;
}
}

Modificato da jjchuck il 03 dicembre 2017 14.28 -
10.286 messaggi dal 09 febbraio 2002
Contributi
Ciao,


cioè se faccio cosi sbaglio?
class Persona: IComparable
{

No, non sbagli. Così ha senso! Implementare IComparable sulla classe Persona va bene perché così può decidere lei stessa il criterio di comparazione (ai fini dell'ordinamento) di oggetti Persona.


ps: perchè mi dici che IComparable è solo per liste di liste?

Sono stato frainteso, cerco di spiegarmi meglio. Tu stavi cercando di implementare IComparable in un tipo generico definito da te che *sembra* una lista (dal nome "ListaGeneric" che gli hai dato):

class ListaGeneric <T> : IComparable<T>

Quindi, l'IComparable<T> implementato da questo tipo sarebbe servito a definire il criterio di comparazione di oggetti ListaGeneric<T>. Quand'è che compari degli oggetti ai fini di ordinamento? Tipicamente quando li hai in una lista (di ListaGeneric). Ecco perché dicevo che stavi cercando di ordinare una liste di liste.

ciao,
Moreno
Modificato da BrightSoul il 03 dicembre 2017 23.37 -

Enjoy learning and just keep making
475 messaggi dal 11 febbraio 2013
Meno male ...per un attimo ho pensato di aver frainteso un po tutto

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.