Skip to main content

Posts

Showing posts with the label linq

Use LINQ to get items of specific type

Ma uitam peste un cod scris de mine in urma cu cateva zile si am gasit urmatoarea linie de cod: var fooCollection = items.Where( x => x is Foo).Select(x => x as Foo); In cazul in care vrem sa extragem elementele dintr-o colectie care sunt de un anumit tip putem sa folosim metoda OfType . Aceasta metoda returneaza toate elementele din colectie de un anumit tip. Colectia pe care o returneaza o sa contina doar elemente de tipul specificat de catre noi. Daca rescriu linia de mai sus o sa obtinem: var fooCollection = items.OfType<Foo>(); Colectia returnata o as fie de tipul dupa care filtram datele. In exemplul dat de mine, rezultatul returnat o sa fie de tip IEnumerable . Astfel incat nu mai este nevoie sa facem nici un fel de conversie. Mai jos gasiti un link pagina MSDN care descrie aceasta functie: http://msdn.microsoft.com/en-us/library/bb360913%28v=vs.110%29.aspx

LINQ: ToDictionary

Se da o lista de obiecte care trebuie convertite intr-un dictionar. O prima implementare la aceasta ar putea sa fie: Dictionary<string,Car> dictionary=new Dictionary<string, Car>(); foreach (var car in cars) { dictionary.Add(car.Code,car); } Putem avea diferite implementări, in diferite moduri. Ce nu trebuie sa uitam ca LINQ ne ofera aceasta posibilitate folosind metoda " ToDictionary ". Cea mai simpla varianta primeste un singur parametru, care specifica cheia key-ul care o sa fie folosit pentru fiecare element care se adauga in dictionar: Dictionary<string,Car> dictionary= cars.ToDictionary(car => car.Code); Un alt overload la aceasta metoda ne permite sa specificam si item-ul care se adauga pentru key-ul dat: Dictionary<string, string> dictionary = cars.ToDictionary(car => car.Code, car => car.Model); Spor!.

Enumerable.Zip

Daca avem doua liste si este nevoie sa facem merge la elemente doua cate doua in ordinea pozitiei din lista este nevoie sa scriem un cod asemanator cu acesta: var numeList = new[] { "Ioan", "Gheorghe", "Mihai", "Laurentiu" }; var prenumeList = new[] { "Pop", "Rus", "Ratiu", "Negru" }; var numePrenumeList = new List<string>(); for(int i = 0; i < numeList.Count(); i++) { numePrenumeList.Add(numeList[i] + " " + prenumeList[i]); } Rezultatul ar fi: Ioan Pop Gheorghe Rus Mihai Ratiu Laurentiu Negru Acelasi lucru putem sa il facem daca folosim metoda Enumerable.Zip. Prin intermediul acestei metode putem sa facem merge intre doi vectori element cu element: var numePrenumeList = numeList.Zip( prenumeList, (nume, prenume) => nume + " " + prenume); Nu o sa avem nevoie de acesta metoda in fiecare zi, dar mi s-a parut o metoda pe care merita sa o cunoaste...

ConvertAll - Conversia unei liste mult mai usor

Avem urmatorul scenariu. O lista de elemente de tip A, pe care trebuie sa o convertim la o lista de tip B. Pentru a putea rezolva aceasta problema putem să implementam operatorul implicit sau explicit de conversie, iar apoi să iteram prin lista pentru a face conversia la tipul B. List<A> listaA; List<B> listaB; ... foreach(A a in listaA) { listaB.Add(a); } sau listaB.foreach(item=>listaB.Add(item)); Ambele soluții sunt rezonabile, dar e puțin mai greu de înțeles ca in spate se face o conversie. Pentru a face codul mai clar putem să facem in felul următor: listaB = listaA.ConvertAll<B>(item => item) Ce am scris mai sus? Fiecare element din listaA convertestel in tipul B si adaug-al in colecția care rezulta. item => item am putut sa scrie deoarece am presupus ca un operator de conversie implicita sau explicita intre cele doua tipuri a fost deja implementat. In cazul in care acesta nu ar fi implementat am avea ceva asemanator: Din private B ConvertAToB(A a)...

Care este cea mai rapida metoda pentru a obtine index-ul unui element din IEnumerable

De cate ori nu v-ati lovit de acest caz? Sa aveti un obiect de tip enumerable si sa fim nevoiti sa obtineti indexul unui element. Exista mai multe metode pentru a rezolva aceasta problema, cea mai simpla din ele este: obj.ToList().FindIndex( x => x =="Blog" ) Pentru cazul in care am cautat elementul care are valoarea "Blog". Daca ne punem problema vitezei putem sa scriem noi o metoda popie: public static int FindIndex<T>(this IEnumerable<T> elemente, Predicate<T> conditie) { int index = 0; foreach (var item in elemente) { if (conditie(item)) { return index; } index++; } return -1; } Prima optiune ne sperie putin din cauta la ToList(). Ne punem problema performantei, am prefera parca sa nu folosim ToList() si sa mergem pe metoda scrisa de noi. elemente.Select((item, index) => new { item, index }) ...