次の方法で共有


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

  • Anonymous
    January 18, 2008
    The comment has been removed

  • Anonymous
    January 20, 2008
    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

  • Anonymous
    January 21, 2008
    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!

  • Anonymous
    January 21, 2008
    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# :-)

  • Anonymous
    January 22, 2008
    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

  • Anonymous
    January 23, 2008
    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

  • Anonymous
    January 23, 2008
    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.

  • Anonymous
    January 23, 2008
    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..

  • Anonymous
    January 23, 2008
    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.

  • Anonymous
    January 23, 2008
    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

  • Anonymous
    January 23, 2008
    A questo punto bisognerebbe aprire veramente una rubrica.

  • Anonymous
    January 24, 2008
    "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 ...

  • Anonymous
    January 24, 2008
    "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.

  • Anonymous
    January 24, 2008
    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....

  • Anonymous
    January 24, 2008
    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.

  • Anonymous
    January 27, 2008
    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

  • Anonymous
    January 27, 2008
    Ciao Stefano, assolutamente un buon esempio che rappresenta l'evoluzione del linguaggio c# da .NET 1.0 ad oggi.

  • Anonymous
    January 27, 2008
    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....

  • Anonymous
    January 27, 2008
    The comment has been removed

  • Anonymous
    January 27, 2008
    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.

  • Anonymous
    January 28, 2008
    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?

  • Anonymous
    January 28, 2008
    Devi essere un docente e/o ricercatore. Mandami una mail tramite il blog.

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

  • Anonymous
    January 28, 2008
    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 :-)

  • Anonymous
    January 28, 2008
    The comment has been removed

  • Anonymous
    January 29, 2008
    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.

  • Anonymous
    January 29, 2008
    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

  • Anonymous
    January 29, 2008
    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

  • Anonymous
    January 29, 2008
    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

  • Anonymous
    January 29, 2008
    Ciao Stefano, grazie della segnalazione degli articoli, non conoscevo gli ultmi due, molto interessanti.

  • Anonymous
    April 16, 2008
    Odinare numeri pari e dispari con LINQ