LINQ

Probleme de la interviu legate de LINQ

Posted by anghelvalentin on September 07, 2019

LINQLanguage Integreted Query – sau cum imi place mie sa-i zic SQL de C#, este un feature aparut ulterior in C# (.NET Framework 3.5 pentru cunoscatori), care a prins la public deoarece este usor de folosit si salveaza multe linii de cod. Nu la toate interviurile primesti probleme legate de el, dar am observat in multe proiecte ca este folosit.

Probleme la interviu

  1. Un feature al LINQ-ului este ca este executat doar in momentul iterarii. O problema care m-a incercat la un interviu a fost asta:
static void Main(string[] args)
{
	string[] names = new string[] { "Steven", "James", "Yan" };
	var selectedName = (from name in names
						where name[4].Equals('e')
						select name); 
	foreach (var item in selectedName)
	{
		Console.WriteLine(item); 
	}
}

Pentru Steven, pe pozitia 4 din string se afla e, la James pe pozitia respectiva este s, iar la Yan nu avem aceasta pozitie, deci se arunca exceptie. Ideea care e, intrucat codul se executa in momentul iteratiei, Steven se va afisa, James nu se va afisa si pe urma va fi aruncata exceptia.

Dar daca la interogarea de LINQ aveam si ToList()? In momentul in care se apeleaza ToList, se face si iterarea colectiei, deci se va arunca exceptie, fara sa se mai ajunga in foreach. Pai si probabil te intrebi, daca nu apelam ToList, atunci variabila selectedNames ce tip are. Ia cauta tu pe Google IQueryable.

  1. Cum spuneam mai sus, LINQ te salveaza de multe linii de cod. Daca vrei doar elementele distincte dintr-un vector ar trebui sa scrii cateva zeci de linii de cod, dar cu LINQ rezolvi treaba doar cu apelul unei metode: Distinct (metoda de tip extensie pentru cunoscatori).
int[] resultNumbers = { 2, 2, 3, 5, 5,5 };

var distinctNumbers = resultNumbers.Distinct();

foreach (var f in distinctNumbers)
{
	Console.WriteLine(f);
}

  1. LINQ permite permite, precum SQL, operatii de asociere de tipul join. Daca vrei sa faci un left join, interogarea ar arata in felul urmator:
from c in Cars
join cd in CarsDetails on cd.CarId equals c.CarId into cdl
from cd in cdl.DefaultIfEmpty()
select new {c,cd};

Ce vreau sa retii despre LINQ e ca iti face viata usoara, poti sa scrii selecturi pentru sql direct din codul C# (folosind EntityFramework) si astfel eviti o gramada de probleme destul de des intalnite precum SQL Injection si interogari harcodate in stringuri. De asemenea, mereu cand ai colectii te ajuta. Asa ca baga la cap pentru ca iti trebuie super des.

Codul sursa

PS: Prima problema am primit-o de la rusii aia disperati sa angajeze, care au departamentul de HR plin de fete dragute.