Élkeresés GLEE Gráfokban LINQ-val


LINQ in actionAhogy 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

GLLE élkeresés Label FrissítésselAdott 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


Készült 2009-11-18 10:15 - Kategória: Microsoft, Oktatás, Oracle


Megjegyzés írása

English Spanish French German Italian Hungarian