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.
"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)
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
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!
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# :-)
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
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
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.
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..
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.
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
A questo punto bisognerebbe aprire veramente una rubrica.
"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 ...
"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.
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....
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.