Continui seria dedicata LINQ, iar dupa interogarea si ordonarea unei colectii, voi arata modul usor in care se pot selecta elementele in functie de o anumita conditie. Clauza where va filtra rezultatul conform conditiei primite.
Ordonarea unei colectii cu LINQ
Intr-un articol anterior am interogat o colectie cu LINQ. Presupunem ca in acest scenariu este nevoie de organizarea rezultatului intr-o anumita ordine.
Interogarea unei colectii cu LINQ
LINQ reprezinta un limbaj flexibil, cu o sintaxa asemanatoare SQL, creat pentru a oferi programatorului posibilitatea de a interoga un set de date, de orice fel (din baza de date, XML sau o colectie simpla de obiecte).
Presupunem ca avem urmatoarea structura a claselor:
Despre Enum
Un tip “first-class citizens” din sistemul de tipuri oferit de .Net despre care nu am discutat foarte multe este Enum. Derivat din System.Enum care la randul lui este derivat din System.ValueType acest tip nu poate defini metode, proprietati sau evenimente.
Constrangeri pentru tipurile generice
Presupunem ca avem urmatoarea metoda generica in care declaram si initializam o variabila de tip T. Apoi, apelam metoda ToString.
static void GenericMethod<T>(T obj) { T item = obj; Console.WriteLine(item.ToString()); }
Acest cod functioneaza pentru toate tipurile de date din .Net. Chiar daca T este tip valoare sau tip referinta, in ambele cazuri variabila suporta atribuirea unei valori si apelul metodei ToString (metoda definita de Object).
Urmatoarea metoda generica va genera eroare la compilare: ‘T’ does not contain a definition for ‘CompareTo’ and no extension method ‘CompareTo’ accepting a first argument of type ‘T’ could be found (are you missing a using directive or an assembly reference?). Motivul este simplu, nu toate tipurile ofera metoda CompareTo.
static T AnotherGenericMethod<T>(T obj1, T obj2) { if (obj1.CompareTo(obj2) < 0) return obj1; return obj2; }
Pentru a scapa de aceasta eroare se foloseste un mecanism pe care CLR il numeste constrangere, adica un mod de a limita tipuri care pot fi specificate tipului generic. Implementarea este realizata cu ajutorul lui where, iar compilatorul va sti ca toate tipurile specificate pentru T trebuie sa implementeze interfata IComparable.
static T AnotherGenericMethod<T>(T obj1, T obj2) where T : IComparable { if (obj1.CompareTo(obj2) < 0) return obj1; return obj2; }
An bisect
Pentru ca tot se apropie sfarsitul de an, propun un simplu exercitiu pentru a calcula daca un an este sau nu bisect.
using System; namespace LeapYear { class Program { static void Main(string[] args) { bool isLeapYear = false; Console.WriteLine("Introduceti anul in formatul de 4 cifre:"); int year = Convert.ToInt32(Console.ReadLine()); //prima varianta if(DateTime.IsLeapYear(year)) isLeapYear = true; //a doua varianta if CheckIsLeapYear(year)) isLeapYear = true; if (isLeapYear) Console.WriteLine("Este an bisect"); else Console.WriteLine("Nu este an bisect"); Console.ReadLine(); } private static bool CheckIsLeapYear(int year) { if((year % 4 == 0) || (year % 100 == 0 && year % 400 != 0)) return true; return false; } } }
La multi ani! :)
Compararea unei variabile generice
Compararea cu null
Ajungem in situatia cand, de exemplu, in interiorul unei metode generice trebuie sa comparam o variabila de tip generic cu null sau cu alte variabile de tip generic.
Terminologie transfer date in telefonia mobila.
Pe ecranul telefonului mobil apar numerosi indicatori care ne informeaza ce se intampla in spatele ecranului, indicatori pe care nu ii observam, sau cu care suntem atat de obisnuiti incat nici nu ne mai intrebam ce reprezinta si de ce sunt acolo – pur si simplu ne-am obisnuit sa ii vedem pe ecran.
Am gasit astazi o explicatie (in engleza – daca cineva dintre cei care citesc o traduce il rog sa puna traducerea intr-un comentariu) a simbolurilor care apar in iconul care indica conectarea la serviciul de date. Explicatia este urmatoarea:
Valoarea implicita a unei variabile de tip generic
Cream o metoda generica in interiorul careia vrem sa setam o valoare implicita pentru variabila item de tip T. Scriem astfel:
public static void GenericMethod<T>() { //eroare la compilare T item = null; }
Putere
Fie b un numar natural si e un alt numar natural. Sa se calculeze b la e.
Analiza Programului
Vom utiliza o variabila in care vom calcula puterea. Pentru fiecare iteratie de la 1 la e vom inmulti valoarea bazei cu ea insasi.
using System; namespace Power { class Program { static void Main(string[] args) { int b, p; Console.WriteLine("Introduceti baza:"); if (!int.TryParse(Console.ReadLine(), out b)) throw new FormatException("Format incorect"); Console.WriteLine("Introduceti puterea:"); if(!int.TryParse(Console.ReadLine(), out p)) throw new FormatException("Format incorect"); Console.WriteLine(Power(b,p)); Console.Read(); } public static int Power(int baza, int exponent) { int result = 1; for (int i = 1; i <= exponent; i++) { result = result * baza; } return result; } } }