In versiunea 3.5, Microsoft a introdus cateva facilitati interesante in .Net framework. Enumerable este una dintre ele. In aceasta clasa sunt definite metode care permit interogarea obiectelor care implementeaza IEnumerable
Imi propun sa descriu cat mai multe dintre aceste metode, pe scurt, dand si exemple de folosire.
Voi lucra pe un array de string, cu ajuorul caruia voi demonstra utilizarea unor metode implementate in Enumerable.
Codul demo este urmatorul:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Xml.Linq; namespace SimpleLinq_01 { class Program { static void Main(string[] args) { string[] firstnames = { "Scott", "Steve", "Ken", "Joe", "John", "Alex", "Chuck", "Sarah", "Oz", "Abracham"}; string s = ""; Array.Sort(firstnames, (string x, string y) => x.Length.CompareTo(y.Length)); Array.ForEach<string>(firstnames, (string a) => Console.WriteLine(a)); Console.WriteLine(); Array.ForEach<string>(firstnames, (string a) => s += a + " "); Console.WriteLine(s); Console.WriteLine(); //sorteaza array-ul in functie de ultima litera (da erroare daca exista string.empty in lista). Array.Sort<string>(firstnames, (string x, string y) => { return x[x.Length - 1].CompareTo(y[y.Length - 1]); }); Array.ForEach<string>(firstnames, (string a) => Console.WriteLine(a)); Console.WriteLine(); // va construi un string compus din elementele firstnames separate de virgula s =firstnames.Aggregate<string>((string x, string y) => { return x + "," + y; }); Console.WriteLine(s); // va construi un string compus din elementele firstnames // separate de virgula, luate in ordine inversa s = firstnames.Aggregate<string>((string x, string y) => { return y + "," + x; }); Console.WriteLine(s); Console.WriteLine(); bool ok = firstnames.All<string>((string x) => { return x.Length > 2; }); Console.WriteLine("{0}", ok ? "All ok" : "Some are not ok"); Console.WriteLine(); ok = firstnames.Any<string>((string x) => { return x.Length > 4; }); Console.WriteLine("{0}", ok ? "At least one element is ok." : "None is ok."); Console.WriteLine(); //media lungimilor cuvintelor din lista double average = firstnames.Average(x => x.Length); Console.WriteLine("Average length {0}", average); //media sumei valori ascii a literelor componente average = firstnames.Average(x => { //int count = 0; //for (int i = 0; i < x.Length; i++) // count += (int)x[i]; //return count; return x.ToCharArray().Sum(y => (int)y); //mai simplu decat codul comentat }); Console.WriteLine("Average weight {0}", average); int count = firstnames.Count(x => x.Length > 4); Console.WriteLine("Names with min 5 letters: {0}", count); Console.WriteLine(); string firstW = firstnames.First(x => x.Length > 3); Console.WriteLine("First name with 4 letters is {0}", firstW); Console.WriteLine(); Console.ReadKey(); } } }
care are ca rezultat al executiei:
Joe
Ken
Alex
John
Sarah
Chuck
Steve
Scott
Abracham
Oz Joe Ken Alex John Sarah Chuck Steve Scott Abracham
Joe
Steve
Sarah
Chuck
Abracham
Ken
John
Scott
Alex
Oz
Joe,Steve,Sarah,Chuck,Abracham,Ken,John,Scott,Alex,Oz
Oz,Alex,Scott,John,Ken,Abracham,Chuck,Sarah,Steve,Joe
Some are not ok
At least one element is ok.
Average length 4.4
Average weight 438.2
Names with min 5 letters: 5
First name with 4 letters is Steve
Voi lua, pe rand, bucati de cod pentru explicatii suplimentare:
Array.Sort(firstnames, (string x, string y) => x.Length.CompareTo(y.Length)); Array.ForEach<string>(firstnames, (string a) => Console.WriteLine(a)); Console.WriteLine();
O metoda mai scurta de a sorta un array, scriind, inline, regula de comparare intre doua elemente. In linia urmatoare este afisat fiecare element al array-ului – forma de scriere mult mai scurta decat daca s-ar folosi un ciclu for sau foreach.
Array.ForEach<string>(firstnames, (string a) => s += a + " "); Console.WriteLine(s);
se poate citi: adaoga fiecare element (a) din array plus un spatiu la string-ul s.
//sorteaza array-ul in functie de ultima litera (da erroare daca exista string.empty in lista). Array.Sort<string>(firstnames, (string x, string y) => { return x[x.Length - 1].CompareTo(y[y.Length - 1]); }); Array.ForEach<string>(firstnames, (string a) => Console.WriteLine(a)); Console.WriteLine();
O alta regula de sortare, in functie de ultima litera a cuvantului.
// va construi un string compus din elementele firstnames separate de virgula s =firstnames.Aggregate<string>((string x, string y) => { return x + "," + y; }); Console.WriteLine(s); // va construi un string compus din elementele firstnames // separate de virgula, luate in ordine inversa s = firstnames.Aggregate<string>((string x, string y) => { return y + "," + x; }); Console.WriteLine(s); Console.WriteLine();
Aggregate este o metoda care lipeste elementele array-ului dat folosind regula definita de noi. In cazul dat, regula este primul element + “, ” + elementul al doilea.
Ulterior am schimbat regula pentru a face aceeasi operatie, insa in sens invers, pornind de la ultimul element spre primul.
bool ok = firstnames.All<string>((string x) => { return x.Length > 2; }); Console.WriteLine("{0}", ok ? "All ok" : "Some are not ok"); Console.WriteLine();
O metoda de a verifica daca toate elementele unui array respecta o anumita regula.
sau…
ok = firstnames.Any<string>((string x) => { return x.Length > 4; }); Console.WriteLine("{0}", ok ? "At least one element is ok." : "None is ok."); Console.WriteLine();
daca exista cel putin un element care respecta regula data.
//media lungimilor cuvintelor din lista double average = firstnames.Average(x => x.Length); Console.WriteLine("Average length {0}", average); //media sumei valori ascii a literelor componente average = firstnames.Average(x => { //int count = 0; //for (int i = 0; i < x.Length; i++) // count += (int)x[i]; //return count; return x.ToCharArray().Sum(y => (int)y); //mai simplu decat codul comentat }); Console.WriteLine("Average weight {0}", average);
Se stabileste o regula de calculare a mediei care se aplica pentru elementele array-ului.
int count = firstnames.Count(x => x.Length > 4); Console.WriteLine("Names with min 5 letters: {0}", count); Console.WriteLine();
Sunt numarate elementele care respecta o anumita regula.
string firstW = firstnames.First(x => x.Length > 3); Console.WriteLine("First name with 4 letters is {0}", firstW); Console.WriteLine();
Este returnat primul element care indeplineste o anumita regula.
Intr-un articol viitor voi continua aceasta lista.
Pingback/Trackback
Tweets that mention Metodele Enumerable – partea 1-a | by zeltera -- Topsy.com
Pingback/Trackback
SFM – proiect final partea 3-a | by zeltera
Pingback/Trackback
Interogarea unei colectii cu LINQ | by zeltera