40
C# 3.0 és LINQ Albert István [email protected] MSDN Kompetencia Központ Budapesti Műszaki és Gazdaságtudományi Egyetem Automatizálási és Alkalmazott Informatikai Tanszék 2007. május 24., Budapest Lurdy H Visual Studio "Orcas" Konferenci

2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

Embed Size (px)

Citation preview

Page 1: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

C# 3.0 és LINQ

Albert Istvá[email protected] Kompetencia KözpontBudapesti Műszaki és Gazdaságtudományi EgyetemAutomatizálási és Alkalmazott Informatikai Tanszék

2007. május 24., Budapest Lurdy HázVisual Studio "Orcas" Konferencia

Page 2: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

2

Tartalom

C# 2.0 – rövid ismétlés

Lambda kifejezések, automatikus tulajdonságok

Bővítő metódusok, implicit típusú lokális változók

Objektum és gyűjtemény inicializálás

Névtelen típusok

Standard lekérdezések, LINQ to Objects

Nyelvbe ágyazott lekérdezések

Kifejezés fák

Összefoglalás

Page 3: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

A C# evolúciója

C# 1.0

C# 2.0

C# 3.0

Komponensek felügyelt környezetben• Property, delegate, event

Típusbiztosabb, hatékonyabb nyelv• Generikus típusok, yield return

Nyelvbe ágyazott lekérdezések

Page 4: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

Ismerős alapokGenerikus típusok

Típusbiztosabb, hatékonyabb gyűjteményekDobozolás nélkül

Típussal paraméterezett …osztályok, interfészek, metódusok, delegate-ekTípuskésznyerek a bővebb funkcionalitáshoz

Általánosabb, típusfüggetlenebb de továbbra is típusbiztos programozás

demo

public class List<T> {T[] array = new T[10]; // tárolópublic void Add( T item ) { this.array[count++] = item; }

Page 5: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

Ismerős alapokSorozatok – IEnumerable<T>

Egyszerű sorozat (szekvencia) építésFordító trükk

Felfüggesztett végrehajtás - késleltett kiértékelés(Speciális coroutine támogatás)

demo

public IEnumerable<T> Filter() {foreach( T t in this )

if( t.ToString().StartsWith( "S" ) )yield return t; }

...

static void Main() { ...foreach( int i in list.Filter() )

Console.WriteLine( i ); }

Page 6: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

Ismerős alapokNévtelen metódusok

Tipikus hivatkozás egyszer használatos kódra

Implementáció (kód) átadása metódusnak

demo

public IEnumerable<T> Filter( Predicate<T> filter ) {foreach( T t in this )

if( filter( t ) )yield return t; }

...

static void Main() { ...foreach( int i in list .Filter( delegate( string s ) { return s.StartsWith( "S" ); } ) )

Console.WriteLine( i ); }

Page 7: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

7

Tartalom

C# 2.0 – rövid ismétlés

Lambda kifejezések, automatikus tulajdonságok

Bővítő metódusok, implicit típusú lokális változók

Objektum és gyűjtemény inicializálás

Névtelen típusok

Standard lekérdezések, LINQ to Objects

Nyelvbe ágyazott lekérdezések

Kifejezés fák

Összefoglalás

Page 8: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

Lambda kifejezések

Névtelen metódusok még rövidebb szintaktikával

Ugyanaz mint:

‘s’ típusát kitalálja a környezetből !

Több paraméter esetén a szintaktika

Paraméter nélkül is írható

demo

delegate( string s ) { return s.StartsWith( "S" ); }

s => s.StartsWith( "S" )

( x, y ) => Math.Sqrt( x * x + y * y )

() => 42

Page 9: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

Automatikus tulajdonságokAutomatic properties

A hozzá tartozó mező nem érhető el Get ÉS set is kell egyszerre !A láthatóság különbözhet

demo

public class List<T> {public int Count { get; private set; }public void Add( T item ){ this.array[Count++] = item; }

private int <>field0;

public int Count { get { return <>field0; } private set { <>field0 = value; } }

Page 10: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

Bővítő metódusokExtension methods

Meglévő osztály kiterjesztése

T lehet generikus osztály vagy interfész isMostantól minden sorozat szűrhető

demo

namespace linqSample.Utils { public static class Helper { static public IEnumerable<T> Filter( this IEnumerable<T> seq, Predicate<T> filter ) { ... }

Statikus bővítő metódus

A bővítendő típus a ‘this’ kulcsszó utánA névtérben

lévő összes bővítőmetódus engedélyezése using linqSample.Utils;

Page 11: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

Implicit típusú lokális változókLocal Variable Type Inference

Nem kell kiírni a lokális változó típusátA változó típusa a jobb oldali kifejezés típusa lesz

var == „a jobb oldal típusa”

demo

List<string> list = new List<string>();foreach( string x in list.Filter( s => s.StartsWith( "S" ) ) )

var list = new List<string>();foreach( var x in list.Filter( s => s.StartsWith( "S" ) ) )

Page 12: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

12

Tartalom

C# 2.0 – rövid ismétlés

Lambda kifejezések, automatikus tulajdonságok

Bővítő metódusok, implicit típusú lokális változók

Objektum és gyűjtemény inicializálás

Névtelen típusok

Standard lekérdezések, LINQ to Objects

Nyelvbe ágyazott lekérdezések

Kifejezés fák

Összefoglalás

Page 13: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

Objektum inicializálókObject initializers

Objektumok inicializálása ha nincs megfelelő konstruktor

Mezők és tulajdonságok beállítása

Kifejezésben is használható

demo

var b=new Music{ Title="Soul Bop",Length=591 }

new Music { Title = "Soul Bop", Length = 591 } . Dump();

list.Add( new Music { Title = "Soul Bop", Length = 591 } );

var b0=new Music();b0.Title="Soul Bop";b0.Length=591;var b = b0;

Page 14: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

Beágyazott tagokra is

Összetett típusú tagok inicializálásaCsak a tulajdonságok beállítása

Új objektum létrehozása értékadással

demo

new Music { Title = "Soul Bop", Length = 591, Album = { Artist = "Bill Evans", Year = 2000 } }

new Music { Title = "Soul Bop", Length = 591, Album = new Album{ Artist = "Bill Evans", Year = 2000 } }

Page 15: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

Gyűjtemények inicializálása

Hasonló a tömb inicializáláshoz

Publikus Add metódust hívTöbb paraméteres Add metódust is támogat, pl:

Új implicit tömb inicializálás

demo

var szamok = new Dictionary<int, string> { { 0, "nulla" }, { 1, "egy" }, { 2, "kettő" } };

var v = new [ ] { 1, 1.5, 2.3 }; // double [ ]

var list = new List<Music> { new Music { Title = "Soul Bop", Length = 591 }, new Music { Title = "Hangin' in the City", Length = 397 } };

Page 16: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

Névtelen osztályok

Az osztály az inicializáláskor kapott tagokat kapjaTulajdonságokToString(), Equals( object ), GetHashCode()

Azonos típus- és névsorrend ugyanazt a típust hivatkozza

var list = new [ ] {new { Title = "Soul Bop", Length = 591 },new { Title = "Hangin' in the City", Length = 397 } };

foreach( var x in list.Filter( s => s.Length < 300 ) )Console.WriteLine( x );

demo

Page 17: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

17

Tartalom

C# 2.0 – rövid ismétlés

Lambda kifejezések, automatikus tulajdonságok

Bővítő metódusok, implicit típusú lokális változók

Objektum és gyűjtemény inicializálás

Névtelen típusok

Standard lekérdezések, LINQ to Objects

Nyelvbe ágyazott lekérdezések

Kifejezés fák

Összefoglalás

Page 18: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

Standard lekérdezések Standard Query Operators

Sorozatokon (sequence, IEnumerable<T>) működnekA sorozat egyszerűen átalakítható: ToList(), ToArray(), ...

A System.Linq.Enumerable statikus osztály bővítő metódusaiból állnak

System.Core.dll, .NET 2.0-val is működik

JellemzőikTipikusan késői kiértékeléssel dolgoznak (yield)

• Kivételek, például Reverse(), OrderBy(), stb.

Összefűzhetőek, mégis hatékonyakMegmarad a jó olvashatóság, komponálhatóság

demo

Page 19: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

A LINQ To Objects műveletei

Szűrés Where

Projekció Select, SelectMany

Rendezés OrderBy, ThenBy

Csoportosítás GroupBy

Joinok Join, GroupJoin

Quantifiers Any, All

Particionálás Take, Skip, TakeWhile, SkipWhile

Halmazműveletek Distinct, Union, Intersect, Except

Elemek First, Last, Single, ElementAt

Aggregáció Count, Sum, Min, Max, Average

Konverzió ToArray, ToList, ToDictionary

Kasztolás OfType<T>, Cast<T>

demo

Page 20: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

20

Tartalom

C# 2.0 – rövid ismétlés

Lambda kifejezések, automatikus tulajdonságok

Bővítő metódusok, implicit típusú lokális változók

Objektum és gyűjtemény inicializálás

Névtelen típusok

Standard lekérdezések, LINQ to Objects

Nyelvbe ágyazott lekérdezések

Kifejezés fák

Összefoglalás

Page 21: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

from m in list where m.Title.StartsWith( "S" ) select m. Title;

list.Where( m => m. Title.StartsWith( "S" ) ) .Select( m => m.Title);

LekérdezésekQuery Expressions

Lekérdezések nyelvi szinten (C# 3.0, VB 9.0)

A nyelvbe ágyazott lekérdezéseket metódushívásokká alakítja a fordító

demo

Page 22: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

A lekérdezések mintája

from id in source{ from id in source | join id in source on expr equals expr [ into id ] | let id = expr | where condition | orderby ordering, ordering, … } select expr | group expr by key[ into id query ]

from-mal kezdődik

További from, join, let, where, vagy

orderby

Végül select by group byOpcionálisan

into-val folytatható

A Query Expression Pattern

metódusai

Where

Select, SelectMany

OrderBy, OrderByDescending, ThenBy, ThenByDescending

GroupBy

Join, GroupJoin

Cast<T>

Page 23: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

Késleltetett kiértékelés mégegyszerDeferred Query Execution

list

TitleLengthID select

m => m.Title

cimek

m => m.Title.StartsWith("S”)

where

var list = new List<Music> { ... };

q.ToList();

var q = from m in list where m.Title.StartsWith( "S" ) select m.Title;

var q = list.Where( m => m.Title.StartsWith( "S" ) ) . Select( m => m.Title);

Page 24: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

24

Tartalom

C# 2.0 – rövid ismétlés

Lambda kifejezések, automatikus tulajdonságok

Bővítő metódusok, implicit típusú lokális változók

Objektum és gyűjtemény inicializálás

Névtelen típusok

Standard lekérdezések, LINQ to Objects

Nyelvbe ágyazott lekérdezések

Kifejezés fák

Összefoglalás

Page 25: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

LINQ to ...

Mi kell ahhoz, hogy elvégezzük az átalakítást?Leképezés: osztály – tábla, tag – oszlop, stb.A szűrési feltétel eredeti, értelmezhető formában

• Nem lefordítva IL kódra

Expression<T> : a kód adatként látszikahol T a kifejezésre jellemző metódusreferencia

from m in list where m.Title.StartsWith( "S" ) select m.Title;

SELECT Title FROM Musicok WHERE Title LIKE ‘S%’

Page 26: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

Kifejezés fák – kódból adatExpression Trees

Expression<Predicate<Music>> expr = m => m.Title.StartsWith( "S" );

public delegate bool Predicate<T>( T obj );

ParameterExpression p= Expression.Parameter(typeof(Music),"m");

expr=Expression.Lambda<Predicate<Music>>( Expression.Call(Expression.Property(p, GetMethod(Music.get_Title)),

GetMethod(string.StartsWith), new Expression [ ] {Expression.Constant("S", typeof(string)) }),

new ParameterExpression [ ] { p });

Page 27: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

27

Expression, Queryable, IQueryableA Queryable hasonló az Enumerable-höz, de:

IQueryable<> interfész : IEnumerable<>, és:Lehetővé teszi a kifejezések összefűzését is, például:

A Queryable osztály bővítő metódusai segítségével a teljes kifejezés eljut az adatforrásig (list, DataTable, stb.)Végül a forrás alakítja át a kifejezést, például T-SQL-lé

public static IQueryable <TSource> Where <TSource>(this IQueryable <TSource> source, Expression < Func <TSource, bool> > predicate);

list . Where(…) . Take(…) . Select (…); // végül egy Expression lesz

Page 28: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

28

LINQ to Desktop Search

OLEDB provideren keresztül, tipikus lekérdezés:

1. A Queryable . Where ( … ) átadja a szűrőt• Építjük és eltároljuk az egészet kifejezést

2. Enumerálásnál átalakítjuk WDS lekérdezéssé

3. Végrehajtjuk a lekérdezést OLEDB-n keresztül• Lezárjuk a kapcsolatot

demo

SELECT System.Title, System.Media.Duration FROM SystemIndex WHERE System.Title = 'Soul Bop'

Page 29: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

Egy kifejezés fa, bejárása

29

demo

new WDS() . Where( m => m.Title.StartsWith( "S" ) && m.Length > 300 );

MethodCallWhere

Object (root)WDS

LambdaExpm => …

GreaterThan… > …

MemberAccessm.Length

Constant300

MethodCall….StartsWith( … )

MemberAccessm.Title

Constant“S”

AndAlso… && …

… WHERESystem.Title LIKE 'S%’

AND….Duration > 300

Page 30: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

LINQ architektúra

System.Linq.Enumerabledelegate alapú

A forrás IEnumerable<T>

System.Linq.Queryablekifejezésfa alapú

A forrás IQueryable<T>

SQL DataSetObjektumok Egyéb...

from m in list where m.Title.StartsWith( "S" ) select m.Title;

var q = list.Where( m => m.Title.StartsWith( "S" ) ) . Select( m => m.Title);

Page 31: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

31

Tartalom

C# 2.0 – rövid ismétlés

Lambda kifejezések, automatikus tulajdonságok

Bővítő metódusok, implicit típusú lokális változók

Objektum és gyűjtemény inicializálás

Névtelen típusok

Standard lekérdezések, LINQ to Objects

Nyelvbe ágyazott lekérdezések

Kifejezés fák

Összefoglalás

Page 32: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

var q = from m in list where m.Title.StartsWith( "S" ) select new { m.Title, m.Length };

var q = list.Where( m => m.Length.StartsWith( "S" ) ) .Select( m => new { m.Title, m.Length } );

C# 3.0

Bővítő metódusok

Lambda kifejezések

Lekérdezések

Objektum inicializálók

Névtelen típusok

Implicit típusú lokális változó

Page 33: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

A másfajta megközelítés előnyei

Bizonyos feladatoknál kisebb hiba százalék

Tömörebb kódDE csak addig tömörítsük, amíg ...

Jobban átlátható, karbantartható

Néha párhuzamosíthatóAkár keretrendszer szinten (PLINQ)

Nyelvi szintű integráció más területekkelRelációs adatok, XML, AD, ...

Page 34: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

A LINQ projekt

Objektumok

<book> <title/> <author/> <year/> <price/></book>

XML

.NET Language Integrated Query

C# 3.0 VB 9.0 más nyelvek…

Relációs adatbázisok

LINQ toObjects

LINQ toSQL

LINQ toXML

LINQ toEntities

LINQ toDataSets

Page 35: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

A .NET 3.5 és a jövő

LINQ to Objects: ez volt most

LINQ to XML: jön a szünet után

LINQ in Visual Basic: még egy óra

LINQ to DataSet: még ebéd előtt

LINQ to SQL: ebéd után

LINQ to Entities: mielőtt haza mennénkLINQ to SharePoint: ...

LINQ to LDAP (Active Directory): ...

LINQ to WMI: …

Paralell LINQ: egy év múlva (?)

Page 36: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

36

Összefoglalás

Nem kell használniDe már most is lehet a .NET 2.0-ban VS 2005-telÚgy nőtt az absztrakciós szint, hogy ‘megmaradt az alja’

Apró lépések a nyelvbenyield return, extension methods, lambda expr., var, stb.

Néhány osztály a Framework-benSystem.Linq.Enumerable (.Where, .OrderBy, ...)

Egy kis transzformációfrom x in ... where ... select ...

A mennyiség végül új minőséggé válik (G. Kasparov)

Page 37: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

37

További információk

Fejlesztői Portál – devPORTAL{..}http://www.devportal.hu

LINQ Project honlaphttp://msdn2.microsoft.com/en-us/netframework/aa904594.aspx

101 LINQ Sampleshttp://msdn2.microsoft.com/en-us/vcsharp/aa336746.aspx

LINQ Project Forumhttp://forums.microsoft.com/msdn/showforum.aspx?forumid=123&siteid=1

Anders Hejlsberg interjú a LINQ-rőlhttp://channel9.msdn.com/showpost.aspx?postid=114680

Visual Studio Code Name „Orcas” letöltésekhttp://msdn2.microsoft.com/en-us/vstudio/aa700831.aspx

Page 38: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

38

Kérdések és válaszok

Kérjük írja meg részletes véleményét az előadással kapcsolatban az értékelőlapon!

Page 39: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

Quicksort C# 3.0-ban

Func<intlist, intlist> Sort = xs => xs.Case( () => xs, ( head,tail ) => ( Sort( tail.Where( x => x < head ) ) )

.Concat ( Single( head ) )

.Concat ( Sort( tail.Where( x => x >= head ) ) ) );

type inference

összefűzés

magasabb rendű funkció

típussal paraméterezett funkció

rekurzió szűrés

lambda kifejezés

Page 40: 2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben • Property, delegate, event Típusbiztosabb, hatékonyabb nyelv • Generikus típusok, yield return

© 2007 Microsoft Corporation. Minden jog fenntartva.Az előadás csupán tájékoztató jellegű, a Microsoft Magyarország a benne szereplő esetleges hibákért vagy tévedésekért semmilyen felelősséget nem vállal.