You are on page 1of 34

Alkalmazásfejlesztés II.

Dr. Dombi József Dániel

Szegedi Tudományegyetem
Informatikai Intézet
Szoftverfejlesztés Tanszék

2021

Alkalmazásfejlesztés II. 2021 Delegate 1 / 34


Tartalom

2 Anonymous function 3 Lambda


1 Delegate 4 LINQ

Fordítás ideje: 2021.09.20 22:54:51 git branch: master 049531506b7985c78194fd549658c4cb9ad8f6e0

Alkalmazásfejlesztés II. 2021 Delegate 2 / 34


Delegate

A delegate típus deklarációja hasonló a függvény deklarációval


Van egy visszatérési értéke és bármennyi bármilyen típusú paramétere
lehet.
A System.Actions és System.Func általános gyakran használt
delegate-ek.
System.Action: lehet bemenő paramétere és nincs visszatérési értéke
System.Func: lehet bemenő paramétere és van visszatérési értéke
System.Pred: lehet bemenő paramétere és logikai visszatérési értéke
van
System.Func-nál az utolsó paraméter típusa a visszatérési érték.

Alkalmazásfejlesztés II. 2021 Delegate 3 / 34


Delegate

delegate void TestDelegate ( string s );


// teszt f ü ggv é ny
static void M ( string s )
{
Console . WriteLine ( s );
}

// p é ld á nyos í tjuk a delegate t í pust


TestDelegate testDelA = new TestDelegate ( M );
// h í v á s
testDelA ( " Hello . ␣ My ␣ name ␣ is ␣ M ␣ and ␣ I ␣ write ␣ lines . " );

Alkalmazásfejlesztés II. 2021 Delegate 4 / 34


Action

delegate void Dis playMess age ( string message );

private static void S h o w W i n d o w s M e s s a g e ( string message )


{
MessageBox . Show ( message );
}

Displ ayMessag e messageTarget = S h o w W i n d o w s M e s s a g e ;


// ugyanaz Action - nel . Sablon param é terben hat á rozzuk
// meg a bemen ő t í pust .
Action < string > messageTarget = S h o w W i n d o w s M e s s a g e ;

Alkalmazásfejlesztés II. 2021 Delegate 5 / 34


Func

delegate string [] ExtractMethod ( string stringToManipulate ,


i n t maximum );

private static string [] ExtractWords ( string phrase , i n t limit )


{
// csin á lunk valamit
r e t u r n new string [5];
}

ExtractMethod extractMeth = ExtractWords ;


// ugyanaz Func - val . Az utols ó sablon param é ter
// a r e t u r n value t í pusa .
Func < string , i n t , string [] > extractMethod = ExtractWords ;

Alkalmazásfejlesztés II. 2021 Delegate 6 / 34


Alkalmazásfejlesztés II.

Dr. Dombi József Dániel

Szegedi Tudományegyetem
Informatikai Intézet
Szoftverfejlesztés Tanszék

2021

Alkalmazásfejlesztés II. 2021 Anonymous function 7 / 34


Tartalom

2 Anonymous function 3 Lambda


1 Delegate 4 LINQ

Fordítás ideje: 2021.09.20 22:54:51 git branch: master 049531506b7985c78194fd549658c4cb9ad8f6e0

Alkalmazásfejlesztés II. 2021 Anonymous function 8 / 34


Anonymous függvények

Ahol delegate típust kell megadnunk tudunk használni névtelen


függvényeket.
Lambda kifejezéssel, vagy névtelen eljárássokkal tudunk létrehozni
névtelen függvényeket.
Ha egy függvényt csak egy delegate-nél akarunk használni, akkor nem
szükséges külön deklarálni.

Alkalmazásfejlesztés II. 2021 Anonymous function 9 / 34


anonymous függvények

delegate void TestDelegate ( string s );


static void M ( string s )
{
Console . WriteLine ( s );
}

TestDelegate testDelA = new TestDelegate ( M );

// anonymous method
TestDelegate testDelB = delegate ( string s ) { Console . WriteLine ( s ); };

// Lambda kifejez é s
TestDelegate testDelC = ( x ) = > { Console . WriteLine ( x ); };
testDelA ( " Hello . ␣ My ␣ name ␣ is ␣ M ␣ and ␣ I ␣ write ␣ lines . " );
testDelB ( " Hello . ␣ My ␣ name ␣ is ␣ M ␣ and ␣ I ␣ write ␣ lines . " );
testDelC ( " Hello . ␣ My ␣ name ␣ is ␣ M ␣ and ␣ I ␣ write ␣ lines . " );

Alkalmazásfejlesztés II. 2021 Anonymous function 10 / 34


Alkalmazásfejlesztés II.

Dr. Dombi József Dániel

Szegedi Tudományegyetem
Informatikai Intézet
Szoftverfejlesztés Tanszék

2021

Alkalmazásfejlesztés II. 2021 Lambda 11 / 34


Tartalom

2 Anonymous function 3 Lambda


1 Delegate 4 LINQ

Fordítás ideje: 2021.09.20 22:54:51 git branch: master 049531506b7985c78194fd549658c4cb9ad8f6e0

Alkalmazásfejlesztés II. 2021 Lambda 12 / 34


Lambda kifejezés
Lambda kifejezések a következő alakú lehet
(input-parameters) => expression
(input-parameters) => <sequence-of-statements>
A paraméter listát és törzset a => operátor választja el.
a Lambda kifejezés delegate típusra konvertálódik. Ha nincs
visszatérési érték, akkor Action, ha van visszatérési érték, akkor Func.
Ha csak egy input paraméter van, akkor a zárójelek() opcionálisak,
egyébként meg kötelező kiírni.
a Fordító az input paraméterek típusát legtöbb esetben meg tudja
határozni, ha nem, akkor nekünk kell megadni.

Alkalmazásfejlesztés II. 2021 Lambda 13 / 34


Lambda kifejezések
// x bemen ő param é ter é s a r e t u r n é rt é k az x * x
Func < i n t , i n t > square = x = > x * x ;
Console . WriteLine ( square (5));
// Output : 25

// z á r ó jel opcion á lis , nem k ö telez ő ki í rni


Func < i n t , i n t > square = ( x ) = > x * x ;

Alkalmazásfejlesztés II. 2021 Lambda 14 / 34


Lambda kifejezések
// param é ter n é lk ü li Lambda kifejez é s
Action line = () = > Console . WriteLine ();

// k é t i n p u t param é terrel rendelkez ő lambda kifejez és ,


// A param é terek ,- vel vannak elv á lasztva .
Func < i n t , i n t , b o o l > t es tF o rE qu al i ty = (x , y ) = > x == y ;

// Az i n p u t param é terek t í pus á t i s megadhatjuk


Func < i n t , string , b o o l > isTooLong =
( i n t x , string s ) = > s . Length > x ;

Alkalmazásfejlesztés II. 2021 Lambda 15 / 34


Lambda kifejezések
// Statement lambda
Action < string > greet = name = >
{
string greeting = " Hello ␣ { name }! " ;
Console . WriteLine ( greeting );
};
greet ( " World " );
// Output : Hello World !

Alkalmazásfejlesztés II. 2021 Lambda 16 / 34


Alkalmazásfejlesztés II.

Dr. Dombi József Dániel

Szegedi Tudományegyetem
Informatikai Intézet
Szoftverfejlesztés Tanszék

2021

Alkalmazásfejlesztés II. 2021 LINQ 17 / 34


Tartalom

2 Anonymous function 3 Lambda


1 Delegate 4 LINQ

Fordítás ideje: 2021.09.20 22:54:51 git branch: master 049531506b7985c78194fd549658c4cb9ad8f6e0

Alkalmazásfejlesztés II. 2021 LINQ 18 / 34


LINQ

LINQ segítségével C# nyelvi szinten tudunk lekérdezéseket megadni.


Általában a lekérdezések szöveg tipusúak és nincs fordítási támogatás.
Hátrány, hogy meg kell ismernünk az egyes adat típusokhoz tartozó
lekérdezési nyelvet: pl: SQL adatbázis, XML dokumentum, web
szolgáltatás stb.
LINQ segítségével query expression-öket tudunk írni és a szintaxisa a
query-nek támogatja az alap lekérdezéseket mint például szűrés,
rendezés, csoportosítás.

Alkalmazásfejlesztés II. 2021 LINQ 19 / 34


LINQ
// p é lda t ö mb l é trehoz á s
i n t [] scores = new i n t [] { 97 , 92 , 81 , 60 };

// lek é rdez é s defini á lsa


IEnumerable < i n t > scoreQuery =
from score i n scores
where score > 80
select score ;

// Lek é rdez é s v é grehajt á sa


foreach ( i n t i i n scoreQuery )
{
Console . Write ( i + " ␣ " );
}

Alkalmazásfejlesztés II. 2021 LINQ 20 / 34


LINQ

Query expression-öket lekérdezésre és adat transzformációra


használhatjuk a LINQ-et támogató adatszerkezeteken.
LINQ lekérdezéseket C# nyelven fogalmazzuk meg.
A változók a LINQ-ben erősen típusolt. A fordító ki tudja találni.
LINQ lekérdezés akkor hajtódik végre, ha lekérdezési változón
iterálunk (pl: foreach).
A LINQ lekérdezés átkonvertálódik Standard Query Operátor
műveletekre.
Támogatott adatszerkezetek: LINQ TO XML, LINQ TO OBJECTS,
LINQ TO ENTITIES,...

Alkalmazásfejlesztés II. 2021 LINQ 21 / 34


LINQ felépítése

A query egy olyan lekérdezés, amely adatokat kap az adatforrástól.


LINQ lekérdezés során végig object-ekkel foglalkozunk.
A LINQ query három részből áll:
Adatforrás meghatározás
Lekérdezés megfogalmazása
Lekérdezés végrehajtása
Az adatforrás olyan szerkezet, amely megvalósítja IEnumerable, vagy
ennek leszártamzott interface-ét. (pl: IQueryable)

Alkalmazásfejlesztés II. 2021 LINQ 22 / 34


LINQ query

A lekérdezés során meg kell adnunk a feltételeket, hogy az


adatforrásból mit szeretnék lekérdezni.
A query opcionálisan tartalmazhatja, hogy az adatot hogyan
rendezzük, csoportosítsuk, vagy hogyan nézzen ki.
A lekérdezést úgynevezett query variable-ba tároljuk.
Query szintaxisa három fő részből áll
from: az adatforrás meghatározása
where: szűrési feltétel
select: a visszatérési elemek tipusát határozza meg.

Alkalmazásfejlesztés II. 2021 LINQ 23 / 34


LINQ query végrehajtás

A query variable csak a lekérdezési parancsot tartalmazza.


A query akkor értékelődik ki, ha alkalmazzuk például foreach-ben.
Az eredmény a foreach során értékelődik ki és a foreach-ben lévő
változó fogja tartalmazni a query egyes elemeit.
A query akkor is kiértékelődik, ha aggregációs műveletet használunk
(count, max, First, Average). Ebben az esetben először végig kell
iterálni az adatforráson, hogy meghatározzuk az értéket. Viszont az
érték egyetlen egy elem lesz.
A query akkor is kiértékelődik, ha a ToList, vagy ToArray
metódusokat meghívjuk. Ebben az esetben elmentjük az értékeket.

Alkalmazásfejlesztés II. 2021 LINQ 24 / 34


LINQ
var evenNumQuery =
from num i n numbers
where ( num % 2) == 0
select num ;
// query v é grehajt á sa
i n t evenNumCount = evenNumQuery . Count ();

// query azonnali v é grehajt á sa


List < i n t > numQuery2 =
( from num i n numbers
where ( num % 2) == 0
select num ). ToList ();

Alkalmazásfejlesztés II. 2021 LINQ 25 / 34


LINQ Generikus objektumok
// az eredm é ny Customer o b j e c t lesz é s ezt ki i s tudjuk haszn á lni
// a lek é rdez é s sor á n . L á st a customer - nek van city p r o p e r t y - je .
IEnumerable < Customer > customerQuery =
from cust i n customers
where cust . City == " London "
select cust ;

foreach ( Customer customer i n customerQuery )


{
Console . WriteLine ( customer . LastName + " ,␣ " + customer . FirstName );
}

Alkalmazásfejlesztés II. 2021 LINQ 26 / 34


LINQ query

Az első lépés a data source meghatározása: from változó in


datasource
Változót úgy kell kezelni, mintha foreachben használnánk. A változó
tipusát nem kell megadnunk.
További módosítása az eredménynek a let kulcsszóval lehetséges,
azaz tovább bonthatjuk az adatforrás eredményét.
A where kulcsszóval szűrést tudunk végrehajtani. A where feltételben
a logikai kifejezést kell kiértékelni. A kiértékelés során azokat az
elemeket kapjuk vissza, ami eleget tesz a feltételnek. Logikai
operátorokat lehet használni.
Az orderby segítségével tudjuk rendezni az eredményt: ascending,
descending.
A csoportosítást a group segítségével tudjuk elvégezni. Az eredmény
listában a lista lesz.
A select segítségével a projekciót tudjuk megadni.
Alkalmazásfejlesztés II. 2021 LINQ 27 / 34
LINQ lekérdezések
// customers - b ő l k é rdez ü nk le é s a v á ltoz ó n é v a cust .
var q u e r y A l l C u s t o m e r s = from cust i n customers
select cust ;

string [] strings =
{
" A ␣ penny ␣ saved ␣ is ␣ a ␣ penny ␣ earned . " ,
" The ␣ early ␣ bird ␣ catches ␣ the ␣ worm . " ,
};

// A mondatokat bontsuk sz é t szavakra .


// A let seg í ts é g é vel tudjuk szavakra bontani .
var earlyBir dQuery =
from sentence i n strings
let words = sentence . Split ( ’␣ ’)
from word i n words
let w = word . ToLower ()
select w ;

Alkalmazásfejlesztés II. 2021 LINQ 28 / 34


LINQ lekérdezések
// sz ű r é s . Tudjuk , hogy customer objektumr ó l van sz ó
// é s annak van City propertyje .
var q u e r y L o n d o n C u s t o m e r s =
from cust i n customers
where cust . City == " London "
select cust ;

// logikai és - re p é lda
where cust . City == " London " && cust . Name == " Devon "

// logikai vagy - ra p é lda


where cust . City == " London " || cust . City == " Paris "

Alkalmazásfejlesztés II. 2021 LINQ 29 / 34


LINQ lekérdezések
// n é v szerint rendez é s A - > Z .
var q u e r y L o n d o n C u s t o m e r s 3 =
from cust i n customers
where cust . City == " London "
orderby cust . Name ascending
select cust ;

Alkalmazásfejlesztés II. 2021 LINQ 30 / 34


LINQ lekérdezések
// Csoportos í t á s sor á n az eredm é ny be á gyazott lista .
var q u e r y C u s t o m e r s B y C i t y =
from cust i n customers
group cust by cust . City ;

// customerGroup i s an IGrouping < string , Customer >


foreach ( var customerGroup i n q u e r y C u s t o m e r s B y C i t y )
{
// a csoport kulcsa
Console . WriteLine ( customerGroup . Key );
// csoportban l é v ő elemek .
foreach ( Customer customer i n customerGroup )
{
Console . WriteLine ( " ␣ ␣ ␣ ␣ {0} " , customer . Name );
}
}

Alkalmazásfejlesztés II. 2021 LINQ 31 / 34


LINQ lekérdezések
// Teljes objektumok visszaad á sa
IEnumerable < Student > studentQuery1 =
from student i n app . students
where student . ID > 111
select student ;

// Studentnek van egy Last propertyje , ami a keresztnevet tartalmazza .


IEnumerable < String > studentQuery2 =
from student i n app . students
where student . ID > 111
select student . Last ;

// Studentnek a Scoore t ö mbbe t á roljuk az eredm é ny é t


// A legels ő eredm é ny é t n ö velj ü k 10% - val .
IEnumerable < double > studentQuery5 =
from student i n app . students
where student . ID > 111
select student . Scores [0] * 1.1;

Alkalmazásfejlesztés II. 2021 LINQ 32 / 34


LINQ lekérdezések
// Eddigi eredm é ny é nek á tlaga
IEnumerable < double > studentQuery6 =
from student i n app . students
where student . ID > 111
select student . Scores . Average ();

// Ú j t í pus l é trehoz á sa new - val . Ekkor var - t kell haszn á lnunk .


var studentQuery7 =
from student i n app . students
where student . ID > 111
select new { student . First , student . Last };
foreach ( var item i n studentQuery7 )
{
Console . WriteLine ( " {0} , ␣ {1} " , item . Last , item . First );
}

Alkalmazásfejlesztés II. 2021 LINQ 33 / 34


Köszönöm a figyelmet!

Alkalmazásfejlesztés II. 2021 34 / 34

You might also like