Come odinare numeri pari e dispari …


Forse un po' per divertimento (forse non per tutti), ma Stefano mi segnala questo simpatico quesito risolto con LINQ: data una lista di numeri pari e dispari non in ordine (ad esempio : 1,7,9, 2, 3, 4, 3, 4, 2, 3, 4, 5, 2, 0, 9) come si separano i numeri pari da quelli dispari ?

List<int> elenco = new List<int> { 1,7,9, 2, 3, 4, 3, 4, 2, 3, 4, 5, 2, 0, 9 };
var pariEdispari = elenco.OrderBy(s => s % 2 != 0);
var pariEdispariOrdinati = elenco.OrderBy(s => s % 2 != 0).ThenBy(s => s);

foreach (var item in pariEdispariOrdinati)
{
Console.WriteLine(item);
}


L'operatore ThenBy si può applicare dopo la OrderBy perchè può essere applicato solo ad una IOrderedEnumerable<T> e non ha una IEnumerable<T>


Quante righe di codice ci vorrano mai se non si usasse LINQ ?


Mahh?? Sicuramente non ci penserò durannte il week-end.

Pietro   Click to IM Pietro

Comments (31)

  1. Grando capo Estiqaatsi says:

    "Grande capo Estiqaatsi[1],

    Pietro racconta che Stefano gli ha segnalato un quesito risolto con LINQ: data una lista di numeri pari e dispari non in ordine come si separano i numeri pari da quelli dispari?

    Pietro si domanda quante righe di codice ci vogliano mai se non si usasse LINQ e referisce che non ci penserà durante il week-end"

    (il grande capo risponde)

    Estiqaatsi… pensa che LINQ essere cosa bella.

    Esticazzi pensa anche che, siccome Pietro avere fatto domanda "Quante righe di codice ci vorrano mai se non si usasse LINQ ?", essere cortesia dare risposta.

    Esticazzi dice che risposta essere 1:

    @sorted = sort { ($a%2) <=> ($b%2) || $a <=> $b } (1, 7, 9, 2, 3, 4, 3, 4, 2, 3, 4, 5, 2, 0, 9);

    Esticazzi chiamare tale linguaggio, Perl.

    Esticazzi dire che Perl essere nato 15 anni prima che la prima beta di .NET mettere il naso fuori di casa M$…

    Estiqaatsi ha detto

    [1] Estiqaatsi (si pronuncia esticazzi) grande capo pellerossa, http://it.wikipedia.org/wiki/610_(sei_uno_zero)

  2. PietroBr says:

    Grazie della risposta, ma ammetto intendevo in C# 2.0 o al più in VB.NET 2005:-)

    Perl è assolutamente un linguaggio potente e flessibile, che mi sa essere ancora più vecchio di quello che dici: Larry Wall presento’ nel lontano 1987 il Perl 1.0.

    Se dovessi pensare ad un linguaggio come il Perl, che da’ la possibilità di supportare diversi paradigmi: procedurale, funzionale e OO; ormai mi piace pensare all’ F#: che ha il vantaggio di integrarsi e di poter sfruttare le BCL di .NET. Ok il mio è un giudizio di parte…:-)

    Grazie dello script, che in effetti funziona, ma che, almeno per me, non è leggibilissimo 🙂

    TIMTOWTDI

  3. Claudio says:

    Ciao Pietro,

    ecco qui la mia soluzione in F#:

    #light

    let numbers = [ 1; 7; 9; 2; 3; 4; 3; 4; 2; 3; 4; 5; 2; 0; 9 ]

    let result = numbers |> List.sort Int32.compare |> List.partition (fun x -> x % 2 = 0)

    print_any ((fst result) @ (snd result))

    Per una descrizione ti invito a leggere il mio post sul blog fsharp.it (http://www.fsharp.it/2008/01/22/sorting-odd-and-even-numbers-in-f/)

    Grazie e alla prossima!

  4. PietroBr says:

    Ciao Claudio,

    grazie! Mi sa che inaugurerò una nuova sezione quiz.

    Bel blog assolutamente, non lo conoscevo, grazie della segnalazione.

    E soprattutto grazie dell’ esempio in F# 🙂

  5. Ciao Pietro,

    carino come esempio…

    io l’ho fatto con c++ in università per ricercare i numeri pari all’interno di un vettore e devo dirti che non è stato carino come farlo in linq, pensa che per risolvere ci sono volute un 6 o 6 righe di codice… purtroppo in università non arriveranno mai a pensare di utilizzare .net

    saluti

  6. Grande capo Estiqaatsi says:

    Estiqaatsi pensa che forse avere sbagliato blog, perché forse questo essere blog che parlare di musica e note? C#, F#?

    Estiqaatsi leggere che Fabrizio dire "purtroppo in università non arriveranno mai a pensare di utilizzare .net".

    Estiqaatsi…! pensa che questa essere grande fortuna.

    Estiqaatsi leggere che Fabrizio risolvere problema con 6 righe di codice C++.

    Estiqaatsi…! pensa che essere sempre meglio molte più righe di codice C++ che 1 riga di C#, F# o LINQ.

    Estiqaatsi ha detto.

    PS. Estiqaatsi precisare che non avere sbagliato data di nascita Perl. Estiqaatsi avere detto che:

    * Perl essere nato 15 anni prima di beta .Net

    * beta .Net essere uscita 2002

    Quindi Perl essere rilasciato 2002 – 5 = 1987

  7. PietroBr says:

    Beh, se proprio vuoi essere preciso la prima beta di .NET 1.0 è del 2000.

    Ad ogni modo mi miacerebbe sapere come mai non sia utile l’insegnamento di .NET nelle università. Ho fatto parecchi seminari in diverse università e penso che in un ambiente culturalmente stimolante come quello universitario sia importante avere una visione complessiva dei linguaggi di programmazione e delle tecnoligie informatiche: quindi apprezzo quelle univeristà in cui questa pluralità di voci è rappresentata.

  8. usqwart says:

    Che dire, senza nulla togliere a LINQ che può introdurre vantaggi relativamente alla leggibilità (anche se questo non è sempre detto), secondo me insegnare linguaggi Microsoft o derivati all’Università significa aiutare alla formazione di menti già corporativamente orientate, e poco inclini ad andare verso strumenti aperti a tutti e free..

    Se oltre all’utente medio ci si mettono anche i professionisti a vedere solo Microsoft, il monopolio potrà solo crescere con conseguenze disastrose..

  9. PietroBr says:

    Per questo sono per la pluralità di voci, solo che se ne non si insgnano ANCHE i linguaggi .NET in ambito accademico, questa pluralità viene a mancare.

    Inoltre ormai anche gli strumenti Microsoft hanno delle versioni gratuite e aperte a tutti per non parlare del fatto che in ambito accademico mi è capitato spesso di andare a portare i codici sorgenti di del Kernel di Windows a professori e studenti.

  10. Stefano says:

    Salve, a tutti,

    evitando le solite polemiche che sono a mio parere utili quanto un mal di denti il venerdì, vi propongo la soluzione in C# 2.0 fatta da un mio studente utilizzando un BubbleSort.

    static void Main(string[] args)

    {

       int [] elenco = new int[] { 1, 7, 9, 2, 3, 4, 3, 4, 2, 3, 4, 5, 2, 0, 9 };

       // Bubble Sort

       int passata = 0;

       bool scambio=false;

       do

       {

           scambio = false;

           for (int i = 0; i < elenco.Length – 1 – passata ; i++)

           {

               // Confronta se sono entrambi pari o dispari (omogenei)

               int confrSeOmogenei = (elenco[i] % 2).CompareTo((elenco[i + 1] % 2));

               // Confronta se sono già ordinati

               int confrOrdinamento = elenco[i].CompareTo(elenco[i + 1]);

               // Se non sono omogenei o comunque se non sono in ordine allora scambia

               if (confrSeOmogenei == 1 || (confrSeOmogenei == 0 && confrOrdinamento == 1))

               {

                   scambio = true;

                   int appo = elenco[i];

                   elenco[i] = elenco[i + 1];

                   elenco[i + 1] = appo;

               }

           }

           passata++;

       } while (scambio);

       foreach (int item in elenco)

           Console.WriteLine(item);

    }

    Ciao a tutti

  11. PietroBr says:

    A questo punto bisognerebbe aprire veramente una rubrica.

  12. hjon says:

    "mi è capitato spesso di andare a portare i codici sorgenti di del Kernel di Windows a professori e studenti."

    mi dici anche a me dove trovarli che ho voglia di farmi quattro risate …

  13. Grande capo Estiqaatsi says:

    "Grande capo Estiqaatsi,

    Pietro vorrebbe aprire veramente una rubrica a proposito"

    Estiqaatsi…!, essere contento dell’entusiasmo di Pietro.

    Estiqaatsi pensa che aprire rubrica essere forse cosa esagerata.

    Estiqaatsi dire che essere molto tempo che mondo fare

    questo tipo di gioco per risolvere piccoli problemi.

    Estiqaatsi ad esempio giocare a Perl golf da molto tempo (http://en.wikipedia.org/wiki/Perl#Perl_golf)

    Estiqaatsi pensa che, se anche comunità .NET iniziare ora a giocare a golf, essere meglio tardi che mai.

    Estiqaatsi ha detto.

  14. usqwart says:

    Strano parlare di pluralità quando si fa pubblicità ai quasi monopolisti del mercato..

    A proposito, ma parli del kernel di Windows? E come te lo sei procurato? Non credevo fosse open source….

  15. PietroBr says:

    E’ uno dei programmi che in Microsoft portiamo avanti e a cui hanno accesso le università. Si chiama Windows Academic Program (WAP). Puoi trovare informazioni anche su questo blog.

  16. Stefano says:

    Salve,

    questo esempio si è rivelando come una buona fonte di esercizi ed idee per poter esplorare in classe con i miei studenti le capacità e l’evoluzione del .NET e del C#.

    Tra la prima idea di usare LINQ e la seconda di fare tutto a mano, abbiamo trovato altri 3 sistemi che sfruttano le caratteristiche delle varie versioni del Framework.

    La prima prevede di realizzare un metodo che sia possibile passare al metodo Sort della classe Array, per poter implementare l’ordinamento di cui sopra in questa maniera:

    .NET 1.1

    Array.Sort(elenco, Confronta);

    ….

    int Confronta(int a, int b)

    {

       int ris = (a % 2).CompareTo(b % 2);

       if (ris == 0)

           ris = a.CompareTo(b);

       return ris;

    }

    successivamente, essendo stati introdotti gli anonymous method possiamo riscrivere il codice così

    .NET 2.0

    Array.Sort(elenco, delegate(int a, int b)

           {

               int ris = (a % 2).CompareTo(b % 2);

               if (ris == 0)

                   ris = a.CompareTo(b);

               return ris;

           }

    );

    le lambda function dell’ultima versione lo semplificano ulteriormente.

    .NET 3.0

    Array.Sort(elenco, ((a, b) =>

           {

               int ris = (a % 2).CompareTo(b % 2);

               if (ris == 0)

                   ris = a.CompareTo(b);

               return ris;

           })

    );    

    Fino ad arrivare alla prima versione che utilizza LINQ.

    var elencoOrdinato = elenco.OrderBy(s => s % 2 != 0).ThenBy(s => s);

    Stefano

  17. PietroBr says:

    Ciao Stefano,

    assolutamente un buon esempio che rappresenta l’evoluzione del linguaggio c# da .NET 1.0 ad oggi.

  18. usqwart says:

    Interessante questa cosa del kernel..

    A parte che non ho trovato un link per scaricare i sorgenti se non dopo una registrazione a msdn…

    tu sostieni che mi potrei costruire un mio windows personalizzato? Con interfaccia diversa, funzioni avanzate, e cos’altro mi venisse in mente,…E rilasciarlo magari una mia versione sotto Licenza Artistica?

    Sarebbe un incredibile passo avanti….

  19. PietroBr says:

    Il kernel è a disposizione delle università o dei docenti che lo richiedono, non è scaricabile dall’esterno.

    Puoi scaricare solo il corso che copre un intero corso di Sistemi Operativi. Ci sono anche moduli di confronto con architetture del Kenel di Linux e Unix.

    Puoi anche scaricare una versione semplificata del kernel per scopi didattici che si basa sulle API di NT: si chiama Project Oz.

    Ho fatto un video, dove spiego l’ABC del kernel di windows e WAP che ha scopi di dicattica e di ricerca. Alla fine del video mostro, anche se vedi poco, come compilare la versione del kernel di Windows che c’è nel WAP e come farla partire su una Virual Machine.

    In WAP c’è solo il Kernel di Windows, la parte che è più di intersse in ambaito accademico quindi: gestione dell’ IO, Gestione della memoria etc, non c’è tutto Windows, per intenderci NTOSkrnl.exe

    http://blogs.msdn.com/pietrobr/archive/2007/07/20/windows-academic-program-il-kernel-di-windows.aspx

    Se vuoi saperne di più ti consiglio anche il libro : Windows Internals 4th Edition, di Russinovich e Solomon.

  20. Grande capo Estiqaatsi says:

    Estiqaatsi leggere che Pietro notare che Stefano avere dato "assolutamente un buon esempio che rappresenta l’evoluzione del linguaggio c# da .NET 1.0 ad oggi".

    Estiqaatsi!…, notare una certa similitudine in *evoluzione* C# con funzione Perl ‘sort’:

    * Funzione ‘sort’ Perl:

    sort { $a <=> $b } @list;

    oppure:

    sub sortFunction ($$) { … };

    sort sortFunction @list;

    * Funzione .NET 3.0 (che essere frutto di anni e anni di evoluzione):

    Array.Sort(elenco, ((a, b) => … )

    Estiqaatsi anche questa volta pensa che essere meglio tardi che mai che linguaggio evolvere e scoprire acqua calda…

    Estiqaatsi ha detto.

  21. hjon says:

    Questa cosa del kernel scaricabile non la conoscevo. Interessante.

    Come posso fare per richiedere il kernel? Ma se io aderisco al programma WAP e mi faccio dare i sorgenti del kernel da microsoft, poi che tipo di restrizioni ho? Posso lavorare anche sul kernel di Linux e produrre codice? Che tipo di restrizioni sono previste per aderire al programma?

  22. PietroBr says:

    Devi essere un docente e/o ricercatore. Mandami una mail tramite il blog.

  23. hjon says:

    Si, ma intanto puoi dirmi che tipi di restrizioni ho? O almeno darmi qualche link che lo spieghi in maniera chiara?

  24. Mario B. says:

    Salve a tutti,

    notando comunque le buone intenzioni del Sig. Pietro c’è secondo me un pochino di presupponenza che (e questo con un pizzico di maliziosità) non può non far pensare che sotto tutto ciò ci sia da una parte il grande fratello Microsoft e dall’altra il resto del (povero e mortale) mondo ma, comunque, evitiamo i soliti luoghi comuni!

    Ciò che leggo e che personalmente mi ha dato fastidio sono alcune espressioni apparentemente inopportune lette nel thread.

    * Su quali basi si afferma che il divertimento non è alla alla portata di tutti (sottointenso: i programmatori)?

    * Io non ci capisco nulla del codice postato, ma di fronte al post di pezzi di codice mi auguro che ognuno lo abbia provato. Quel "che in effetti funziona" è sempre figlio di quel distacco e presupponenza da tutto ciò che non sia sotto l’egida di mamma Microsoft?

    * In merito alla pluralità delle voci (i linguaggi, SO, ecc) in campo accademico, penso che Microsoft questo spazio debba conquistarselo unicamente per meriti e non tramite programmi appositi, incentivi e quant’altro…

    A Stefano infine consiglio invece vivamente una pluralità di linguaggi da insegnare ai suoi Studenti 🙂

  25. PietroBr says:

    Ciao a tutti,

    i commenti sono di nuovo aperti come mi avete chiesto, giustamente.

    Consiglio di rimanere in tema con l’argomento del post. Il post iniziale è comunque di natura tecnica e ha lo scopo di incuriosire rigurado alle novità di LINQ che è una delle novità di C# 3.0 e VB 9. Correttamente, come qualcuno ha fatto notare, c’è un pizzico di programmazione funzionale in tutto ciò, già usata in altri linguaggi di programmazione…

  26. usqwart says:

    Rimaniamo in tema.

    L’approccio funzionale di linq mi sembra sia un effetto collaterale (non so se voluto) dell’approccio ad oggetti che microsoft è riuscita a perseguire, rilasciando linguaggi che sembrano essere allo stato dell’arte con altri linguaggi come Java…

    Mi chiedevo se esistessero, così come per Java, anche Framework operativi ed ambienti di sviluppo open source che supportassero Linq ed altri, per confrontarli ed eventualmente metterli a paragone in termini di efficienza ed efficacia.

    Grazie.

  27. PietroBr says:

    Ciao,

    non sono a conoscenza di framework per il confronto di linq con altri linguaggi. Forse basterebbe definire degli scenari di utilizzo e poi fare dei test opportuni, ma non penso sia di così facile realizzazione un confronto del genere. Non so se ti riferisci a qualcosa di diverso..

    L’approccio usato da linq può essere utilizzato per implementare altri "flavour" o implementazioni alla linq: ad esempio "Linq to Amazon", etc.

    Esistono degli esempio di implementazione delle intefacce necessarie per usare lo stesso approccio di programmazione offerto da linq, ma con altre sorgenti dati.

    Per quanto riguarda gli strumenti di sviluppo, puoi provare ad usare le versioni Express di Visual Studio, che sono gratuite.

    Sono da poco anche disponibili i sorgenti di alcune librerie di .NET che possono essere usate per il debugging di applicazioni con Visual Studio 2008 (mi sembra dalla versione Standard in poi). Gli assembly di Linq mi sembra di ricordare che non sono ancora disponibli però.

    Fammi sapere se ti serve qualche riferimento, puoi anche contattarmi via mail

  28. Stefano says:

    Salve,

    un esempio di applicazione di Linq è PLinq

    http://blogs.msdn.com/pfxteam/archive/2007/11/29/6558508.aspx

    http://msdn.microsoft.com/msdnmag/issues/07/10/PLINQ/default.aspx?loc=it

    che consente l’esecuzione di query su processori multicore

    by

  29. Stefano says:

    Dimenticavo !! Un altro ottimo punto di partenza sulla programamzione funzionale in C# l’ho trovato in questo articolo

    http://www.c-sharpcorner.com/UploadFile/rmcochran/IntroductionToFunctionalProgramming01122008083909AM/IntroductionToFunctionalProgramming.aspx

    che è seguito da altri post (e tra loro il mio favorito è questo)

    http://www.c-sharpcorner.com/UploadFile/rmcochran/LazyCalculation01192008092856AM/LazyCalculation.aspx

  30. PietroBr says:

    Ciao Stefano,

    grazie della segnalazione degli articoli, non conoscevo gli ultmi due, molto interessanti.

  31. BabbaBlog says:

    Odinare numeri pari e dispari con LINQ

Skip to main content