Élkeresés GLEE Gráfokban LINQ-val
Ahogy azt már korábbi bejegyzésemben említettem a Microsoft GleeGraph objektum a Node-októl eltérően alapból nem rendelkezik élkeresési funkciókkal, de élek még saját azonosítókkal sem rendelkeznek. Amennyiben egy élet szeretnénk kikeresni, mert mondjuk egy Property-jét vagy UserData-ját szeretnénk módosítani, saját eljárást kell írnunk ehhez. A .NET 3.5-től a fejlesztők rendelkezésére áll egy rendkívül hatékony ezsköz a LINQ (Language Integrated Query) melyek segítségével SQL szerű lekérdezéseket futtathatunk szinte tetszőleges Objektum kollekción (LINQ to Object) vagy adatbázis forrásokon (LINQ to SQL). Miért ne írhatnánk LINQ query-ket élhalmazokra.
A LINQ-ról általában
A LINQ query-k kísértetiesen hasonlítanak az SQL lekérdezésekre, különbség csupán annyi, hogy a select kulcsszó és maga a kiválasztandó objektum deklarációja hátra lett csapva.
var halmaz = from sor in Kollekcio where sor.property == "valami" && sor.propery2=="valami2" select sor;
Az így kapott eredményhalmaz is szintén egy kollekció lesz függetlenül attól, hogy hány elemet tartalmaz, melyeken használhatóak a kollekcióknár már jól megszokott First(), Last(), Next(), OrderBy(), Sum(), Average(), Contains() és még több száz generikus listaeljárás általunk definiált delegate-kkel de akár a jó öreg foreach -et is használhatjuk.
SajatObjektum o = halmaz.First<SajatOjektum>();
Él keresése GleeGraph-ban
Adott egy GleeGraph g gráfobjektum, melynek irányított éleit a g.Edges Edge típusú Generikus Lista tartalmazza és meg szeretném keresni az összes valamilyen A és valamilyen B tulajdonságú node között futó élet. Mivel minden egyes referenciaként hivatkozik azokhoz a csomópontokhoz (SourceNode és TargetNode) melyekhez kapcsolódik a megoldás LINQ-ban az alábbi C# kódot eredményezi, ha a Node-okat épp azonosítójuk alapján határozzuk meg:
var vk = from e in g.Edges where e.SourceNode.Attr.Id =="A" && e.TargetNode.Attr.Id == "B" select e;
vagy irányítatlan esetben:
var vk = from e in g.Edges where (e.SourceNode.Attr.Id =="A" && e.TargetNode.Attr.Id == "B") || (e.SourceNode.Attr.Id =="B" && e.TargetNode.Attr.Id == "A") select e;
Egyszerű, mint az egyszeregy. Ha többet szeretnél még tudni a LINQ-ról, klikk ide: LINQ az MSDN-en

