Objektum inicializálás LINQ-ban

Aki unja, hogy VS 2005-ben prop-tab-tabbal hozzon létre tulajdonságokat, biztos örömmel olvassa Scott Guthrie március 8-i blogbejegyzését, amelyben a C# 3.0 automatikus tulajdonsággyáráról szól. Ezentúl nem kell időt töltenünk a semmitmondó privát mezők gépelgetésével, sőt kerülgetnünk sem kell azokat, ilyen egyszerűen készíthetünk egy osztályt három tulajdonsággal (mondom tulajdonsággal és nem mezővel!):


    public class Kollega
    {
        public string Vezeteknev { get; set; }
        public string Keresztnev { get; set; }
        public string Varos { get; set; }
    }

Sőt, ezeket a tulajdonságokat egy kényelmesebb szintaxissal lehet inicializálni, ráadásul nem csak egyesével, de gyűjteményben is:


    List<Kollega> kollegak = new List<Kollega>();

    kollegak.Add( new Kollega { Vezeteknev = "Balássy", Keresztnev = "György", Varos = "Budapest" } );
    kollegak.Add( new Kollega { Vezeteknev = "Dávid", Keresztnev = "Zoltán", Varos = "Budapest" } );
    kollegak.Add( new Kollega { Vezeteknev = "Gincsai", Keresztnev = "Gábor", Varos = "Nyíregyháza" } );
    kollegak.Add( new Kollega { Vezeteknev = "Kereskényi", Keresztnev = "Róbert", Varos = "Nyíregyháza" } );
    kollegak.Add( new Kollega { Vezeteknev = "Virág", Keresztnev = "András", Varos = "Kecskemét" } );

Folytassuk ott, ahol Scotty abbahagyta, hozzuk össze ezt a LINQ-kel! Használhatjuk a LINQ-et arra, hogy lekérdezzünk elemeket a fenti gyűjteményből:

    var pestiek = from k in kollegak 
                  where k.Varos == "Budapest" 
                  select k.Vezeteknev;

    foreach( string p in pestiek )
    {
        Console.WriteLine( p );
    }

Ebben az esetben a pestiek nevű változó lényegében egy string gyűjteményt fog tartalmazni. (Ez durva csúsztatás, de nekünk most a lekérdezés visszatérési értéke a lényeg.)

Ha nem egyetlen string értékkel szeretnénk visszatérni, hanem többel, konstruálhatunk belőle egy ojjektumot a selectben:

    var szabolcsiak1 = from k in kollegak 
                       where k.Varos == "Nyíregyháza" 
                       select new { k.Vezeteknev, k.Keresztnev };

Ebben az esetben viszont már nem tudjuk megmondani kódolás közben, milyen típusú lesz a visszatérési érték, tehát gondban vagyunk a foreachnél. Erre találták ki a vart! A C# továbbra is egy erősen típusos nyelv, a var itt nem olyan, mint JavaScriptben, vagy VB-ben a variant, itt a var csak annyit jelent, hogy olyan típust használj kedves fordító, ami az egyenlőségek jobb oldaláról kijön:

    foreach( var s in szabolcsiak1 )
    {
        Console.WriteLine( "{0} {1}", s.Vezeteknev, s.Keresztnev );
    }

Sőt, mivel teljesen új objektumokat hozunk létre, aminek a típusát a select utáni rész alapján definiálja a fordító, semmi akadálya, hogy adjunk neveket a tulajdonságainak:

    var szabolcsiak2 = from k in kollegak
                       where k.Varos == "Nyíregyháza"
                       orderby k.Vezeteknev
                       select new { Csaladnev = k.Vezeteknev, Utonev = k.Keresztnev };

    foreach( var s in szabolcsiak2 )
    {
        Console.WriteLine( "{0} {1}", s.Csaladnev, s.Utonev );
    }

Íme, micsoda fegyvert ad a kezünkbe az object initializer szintaktika és a LINQ összeházasítása!

A korábbiakkal ellentétben ez a kód nem fut a 2006. májusi LINQ preview-val, de a 2007. márciusi Orcas CTP-vel megy remekül, ott lehet kísérletezni.

 

Technorati tags: ,

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s