Pa to je malo diskutabilno, oko performansi. Kad uporedis sa disk-based bazom, poredjenje je deplasirano jer ce LINQ skoro uvek biti brzi (pod uslovom da se objekti i kolekcije ne page-uju u virtuelnu memoriju) jer i u najoptimizovanijim bazama u opstem slucaju indeks stranice moraju da se ucitaju sa diska da bi se pretrazile. Imaj u vidu da je RAM memorija takvih karakterisitka da je vreme pristupa bilo kom podatku preko bilo kog validnog pointera uvek isto i veoma brzo, i savim sigurno ti par hiljada redova nece praviti problem (zapravo trajace isto koliko i foreach petlja nad tom kolekcijom)
Ti mozes slobodno da koristis standardne .net strukture koje si pomenuo (a i neke druge pride) ali pretrazivanje svih ovih struktura je ekvivalentno table-scan i cak se i npr SortedArray bazira na table-scan pozivima delegata za poredjenje da bi odredio poziciju novog elementa u nizu. Nigde ti nemas mogucnost da indeksirano pretrazujes te strukture i inace (npr ako imas 1000 slucajno sortiranih brojeva od 200 do 500 ti ne mozes da dobijes pojavljivanje broja 366 bez punog scan-a cak ni u sortedarray).
Da bi to radilo sto ti hoces, LINQ bi morao pri svakoj LINQ komandi compile-time da izanalizira koji indeksi mu trebaju nad kolekcijama (a na osnovu predikata koju mogu biti proizvoljne kompleksnosti), da u runtime na osnovu pristiglih podataka izgradi indeks i da onda iskoristi taj indeks umesto IEnumerable<T> za pretrazivanje. Tri problema, prvo predikat moze biti nedeterministicki i u opstem slucaju ne moze se odrediti sta treba indeksirati niti se moze odrediti kod koji bi efikasno zamenio predikat (jedini nacin da se ovo resi bi bio ono sto SQL server radi, forsirati determinizam i ograniciti operacije u predikatima), drugo zauzima se dodatna memorija i trece ne dobija se nista sa stanovista performansi jer bi tokom gradjenja indeksa svejedno uradio pun table scan.
I pazi, ovo sto sam rekao za LINQ isto vazi i za recimo T-SQL, samo sto se to ne provaljuje tako lako. Npr, ostavimo performanse i indekse sa strane na sekund i uzmimo tabelu i cursor (bez where) nad njom i izvlacimo iz te tabele sve redove koji zadovoljavaju neki uslov (to je nas foreach table scan sa if uslovom), a nasuprot tome uzmi SELECT komandu sa tim istim uslovom (to je nas linq sa predikatom), oni efektivno oba rade istu stvar na isti nacin. Indeks je tu dodat da nas postedi bespotrebnih IO operacija, sta vise da na primer mozes iz T-SQL kurzora da radis b-tree pretrazivanje indeksa i performanse ova dva pristupa bi bile slicne.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić