LINQ to Objects (1) - PowerPoint PPT Presentation

About This Presentation
Title:

LINQ to Objects (1)

Description:

Title: vod do v voje v C#/.NET Author: Dr. Jaroslav PELIK N Last modified by: Jaroslav PELIK N Created Date: 9/13/1997 5:03:38 PM Document presentation format – PowerPoint PPT presentation

Number of Views:78
Avg rating:3.0/5.0
Slides: 39
Provided by: Dr23922
Category:
Tags: linq | objects

less

Transcript and Presenter's Notes

Title: LINQ to Objects (1)


1
LINQ to Objects (1)
  • Definován ve jmenném prostoru System.Linq
  • Slouží k dotazování nad daty, která jsou v
    ope-racní pameti (poli, trídami implementujícími
    rozhraní IEnumerableltTgt)
  • Dotazovací engine je spušten spolu s programem a
    umožnuje lokální dotazování
  • Odpadává nutnost vytvárení vlastních algoritmu
    pro vyhledávání v kolekcích
  • Dotazování není dynamické
  • jakmile se jeden dotaz vyhodnotí a vrátí
    výslednou množinu, tak se do nej již nepromítají
    zmeny v pu-vodních datech

2
LINQ to Objects (2)
  • Pro zápis dotazu LINQ je možné použít napr.
    následující operátory (klícová slova)
  • from
  • první klícové slovo dotazu
  • slouží ke specifikaci datového zdroje, nad kterým
    je prováden dotaz
  • where (Where)
  • umožnuje definovat podmínku (restrikci) pro
    výsledek
  • jestliže podmínka vrátí hodnotu true, tak je
    prvek zahrnut do výsledku
  • select (Select)
  • produkuje výsledky dotazu
  • používá se k implementaci projekce, kde jsou
    pouze nek-teré datové složky objektu použity ve
    výsledku
  • uvádí se vždy na konci dotazu

3
LINQ to Objects (3)
  • group (GroupBy)
  • umožnuje seskupování prvku ve výsledku podle
    urcitého klíce
  • k použití tohoto slova se váže také použití
    klícového slo-va by
  • into
  • používáno v kombinaci s klícovým slovem group,
    join nebo select k uložení výsledku a další možné
    práci s tímto výsledkem
  • orderby (OrderBy, OrderByDescending)
  • slouží k razení prvku ve výsledku podle
    definovaných kritérií
  • pro sestupné razení je možné jej použít s
    klícovým slovem descending

4
LINQ to Objects (4)
  • join (Join, GroupJoin)
  • používá se k propojení prvku z ruzných datových
    zdroju na základe definované podmínky ekvivalence
  • v kombinaci s tímto slovem se používají nová
    slova equals a on
  • let
  • slouží k definici lokální promenné v rámci dotazu
  • do této promenné muže být prirazena sekvence
    elementu, nebo jednoduchá hodnota
  • Jmenný prostor System.Linq definuje ješte další
    rozširující metody, které lze v souvislosti s
    kolekcemi (poli) používat, napr.
  • First, Last
  • výber prvního nebo posledního prvku

5
LINQ to Objects (5)
  • FirstOrDefault , LastOrDefault
  • vrací první, resp. poslední prvek
  • výchozí hodnotu daného datového typu v prípade,
    že dotaz vrátil prázdný výsledek
  • ElementAt
  • vrací prvek podle zadaného indexu
  • Count
  • vrací pocet prvku
  • Union, Intersect, Except
  • provádí množinové operace (sjednocení, prunik a
    rozdíl)
  • Min, Max
  • vrací minimální, resp. maximální hodnotu
  • Sum, Average
  • vypocítá soucet, resp. prumer prvku

6
LINQ to Objects (6)
  • Reverse
  • obrátí poradí prvku v kolekci (poli)
  • Concat
  • spojí dve sekvence (pole, kolekce) dohromady
  • OfType
  • výber pouze tech prvku, které jsou
    specifikovaného typu
  • Take
  • vybere prvních n prvku
  • Skip
  • vybere všechny prvky pocínaje (n1). prvkem
  • TakeWhile
  • Vybírá prvky dokud není splnena urcitá podmínka
  • SkipWhile
  • preskakuje prvky, dokud není splnena urcitá
    podmínka

7
LINQ to Objects (7)
  • Obecný tvar jednoduchého dotazu LINQfrom typ
    promenná in datový_zdroj where
    podmínka_restrikce orderby klíc_razení
    descending select výraz_projekce
  • Príkladint numbers 1, 2, 3, 4, 5 var
    result from n in numbers where n lt
    4 orderby n descending
    select n
  • vybere z pole numbers všechna císla menší
    než 4 a provede jejich sestupné serazení

8
LINQ to Objects (8)
  • Predcházející dotaz muže být také zapsán s
    vy-užitím rozširujících metod a lambda
    výrazuint numbers 1, 2, 3, 4, 5 var
    result numbers.Where(n gt n lt 4).
    OrderByDescending(n gt n)
  • Dotazy LINQ jsou provádeny s tzv. odloženým
    spuštením (deferred execution)
  • dotaz je spušten až ve chvíli, kdy je k nemu
    pristou-peno
  • samotné uložení dotazu do promenné jeho spuštení
    nevyvolá

9
LINQ to Objects (9)
  • PríkladListltintgt numbers new
    Listltintgt 1, 2, 3, 4, 5 var result from n
    in numbers where n gt 3
    select n numbers.Add(6) foreach (int i in
    result) Console.Write("0 ", i)
  • Uvedený program, vypíše hodnoty 4 5 6

10
Soubory a proudy (1)
  • Soubor (file) oznacuje pojmenovanou sadu dat
    uloženou na externím záznamovém médiu (napr. HDD,
    CD, DVD, BD, tape)
  • Proud (stream) predstavuje prostredníka mezi
    zdrojem, resp. príjemcem dat (napr. soubor) a
    našim programem
  • Knihovny dodávané s MS .NET Frameworkem poskytují
    abstraktní trídu Stream (definována ve jmenném
    prostoru System.IO), jež mimo jiné definuje
    abstraktní metody pro operace
  • ctení z proudu Read
  • zápis do proudu Write
  • presun v proudu Seek

11
Soubory a proudy (2)
  • Skutecnost, zda daná operace je na konkrétním
    proudu dostupná, lze overit pomocí vlastností
    CanRead, CanWrite a CanSeek
  • V jazyku C lze pracovat napr. s proudy
  • FileStream (System.IO)
  • pro práci se soubory
  • MemoryStream (System.IO)
  • pro práci s proudy uloženými v operacní pameti
  • NetworkStream (System.Net.Sockets)
  • pro komunikaci v prostredí pocítacové síte
  • Poznámka
  • výše uvedené proudy jsou definovány jako potomci
    abstraktní trídy Stream

12
Trída FileStream (1)
  • Instance trídy FileStream se používají ke ctení a
    k úpravám obsahu souboru
  • Pri vytvárení instance trídy FileStream je možné
    konstruktoru predat napr.
  • název souboru (možno zadat vcetne cesty)
  • informace o režimu otevrení souboru (FileMode)
  • napr. vytvorení nového souboru, otevrení
    existujícího souboru, pridávání dat na konec
    souboru
  • informace o režimu prístupu (FileAccess)
  • soubor urcený pro ctení, pro zápis nebo pro ctení
    i zápis
  • informace o režimu sdílení (FileShare)
  • udávají, zda je soubor urcený výlucne pro daný
    proud, nebo jej soucasne mohou (pro specifikované
    operace) používat i jiné proudy

13
Trída FileStream (2)
  • Definuje napr. vlastnosti
  • Length
  • vrací pocet bytu v proudu
  • Position
  • vrací nebo nastavuje aktuální pozici v proudu
  • Nacítání informací z proudu (souboru) se pro-vádí
    pomocí metodyint Read(byte a, int offset, int
    count)
  • Metoda Read
  • nacítá do pole a od indexu offset nejvýše count
    bytu
  • vrací pocet nactených bytu (nebo nulu, jestliže
    bylo dosaženo konce proudu)

14
Trída FileStream (3)
  • posouvá soucasnou pozici v proudu za poslední
    nactený byte
  • Zápis informací lze realizovat pomocí metodyvoid
    Write(byte a, int offset, int count)
  • Metoda Write
  • zapisuje do proudu z pole a od indexu offset
    count bytu
  • posouvá soucasnou pozici v proudu za poslední
    zapsaný byte
  • Pro nactení, resp. zápis jednoho bytu je možné
    použít metodu ReadByte, resp. WriteByte

15
Trída FileStream (4)
  • Pro nastavení aktuální pozice v proudu slouží
    metodalong Seek(long offset, SeekOrigin origin)
  • Parametr
  • offset
  • udává relativní pozici vzhledem k hodnote
    parametru origin
  • origin
  • specifikuje, zda pozice je vztažena k zacátku,
    konci nebo aktuální pozici v proudu
  • Metoda Seek vrací novou pozici v proudu
  • Po dokoncení práce se souborem by mel být
    príslušný proud uzavren

16
Trída FileStream (5)
  • Soubory lze uzavrít voláním metody Close
  • Metodu Close není nutné volat
  • stací zajistit, aby každý proud byl korektne
    uvolnen
  • je zapotrebí, aby proud byl uzavren za všech
    okol-ností
  • Za úcelem uvolnování zdroju existuje rozhraní
    IDisposable definující metodu Dispose, která
    príslušný zdroj uvolní
  • Pri práci se soubory by mely být použity bloky
    try a finally sloužící pro ošetrení výjimek

17
Trída FileStream (6)
  • PríkladFileStream fs try fs new
    FileStream(data.txt) fs.Write() finally
    if (fs ! null) fs.Dispose()
  • Jazyk C umožnuje zjednodušit použití rozhra-ní
    IDisposable pomocí klícového slova using

18
Trída FileStream (7)
  • Príkladusing (FileStream fs
    new FileStream(data.txt)) fs.Write()
  • Pro ctení (zápis) z (do) proudu je možné také
    využít trídy
  • BinaryReader, BinaryWriter
  • pracují s otevreným proudem (prístupným pomocí
    vlastnosti BaseStream) jako s binárním souborem
  • dovolují císt (zapisovat) vestavené datové typy
  • StreamReader, StreamWriter
  • pracují s otevreným proudem (prístupným pomocí
    vlast-nosti BaseStream) na úrovni znaku textu v
    nejakém kódování (standardne UTF-8)
  • umožnují s obsahem souboru pracovat jako s textem

19
Trída BinaryReader
  • Definována ve jmenném prostoru System.IO
  • Umožnuje nacítání binárních hodnot
  • Pro vytvorení její instance je zapotrebí mít
    otevrený proud
  • Poskytuje zejména metody pro nacítání hodnot
    vestavených datových typu
  • ReadBoolean, ReadByte, ReadChar, ReadDecimal,
    ReadDouble, ReadInt16, ReadInt32, ReadInt64,
    ReadSByte, ReadSingle, ReadString, ReadUInt16,
    ReadUInt32, ReadUInt64
  • Po každém nactení se pozice v proudu posune za
    poslední nactený byte

20
Trída BinaryWriter
  • Definována ve jmenném prostoru System.IO
  • Umožnuje zápis binárních hodnot
  • Pro vytvorení její instance je zapotrebí mít
    otevrený proud
  • Obsahuje 18x pretíženou metodu Write pro zápis
    ruzných vestavených typu do proudu
  • Pri každém zápisu se automaticky posouvá pozice v
    proudu za poslední (zapsaný) byte
  • Zmenu aktuální pozice v proudu je možné provést i
    pomocí metody Seek

21
Trída StreamReader (1)
  • Definována ve jmenném prostoru System.IO
  • Potomek abstraktní trídy TextReader
  • Nacítá znaky z proudu
  • Nacítání je možné realizovat pomocí metody
  • int Read()
  • nacítá z proudu jeden znak reprezentovaný jako
    Int32
  • posunuje pozici v proudu za nactený znak
  • int ReadBlock(char buffer, int index, int
    count)
  • nacítá do pole buffer od indexu index nejvýše
    count znaku
  • vrací pocet nactených bytu
  • posunuje pozici v proudu za poslední nactený znak

22
Trída StreamReader (2)
  • string ReadLine()
  • nacítá z proudu rádek znaku a vrací jej jako
    retezec
  • string ReadToEnd()
  • nacítá z proudu všechny znaky od aktuální pozice
    až do jeho konce (vrací je jako retezec)

23
Trída StreamWriter
  • Definována ve jmenném prostoru System.IO
  • Potomek abstraktní trídy TextWriter
  • Zapisuje znaky do proudu
  • Zapisování je možné realizovat pomocí
    pretíže-ných metod
  • Write()
  • zapisují data ruzných datových typu (v závislosti
    na pre-tížené variante) do proudu
  • WriteLine()
  • zapisují data ruzných datových typu (v závislosti
    na pre-tížené variante) do proudu
  • za poslední zapsaný znak zapisují symbol konce
    rádku

24
Trídy StringReader a StringWriter
  • Definovány ve jmenném prostoru System.IO
  • Trída
  • StringReader je potomkem trídy TextReader
  • StringWriter je potomkem trídy TextWriter
  • Umožnují práci obdobným zpusobem jako trídy
    StreamReader a StreamWriter
  • Operace však neprobíhají nad proudy (soubory),
    ale nad retezci
  • Vhodné pro práci s textovými informacemi
    ulo-ženými v operacní pameti

25
Manipulace se soubory
  • K provádení operací se soubory (vytvárení,
    ko-pírování, mazání, presouvání, otevírání apod.)
    je možné využít trídy
  • File (System.IO)
  • statická trída, která definuje statické metody,
    napr.Copy, Create, Delete, Exists,
    GetAttributes, GetCreationTime, Move, Open,
    SetAttributes, SetCreationTime
  • FileInfo (System.IO)
  • definuje
  • vlastnosti, napr. Attributes, CreationTime,
    DirectoryName, Exists, Extension, Length, Name
  • instancní metody, napr.CopyTo, Create, Delete,
    MoveTo, Open

26
Manipulace s adresári
  • K provádení operací s adresári (vytvárení,
    mazá-ní, presouvání, zjištování souboru a
    podadresáru v adresári apod.) je možné využít
    trídy
  • Directory (System.IO)
  • statická trída, která definuje statické metody,
    napr.CreateDirectory, Delete, Exists,
    GetCreationTime, GetCurrentDirectory,
    GetDirectories, GetFiles, GetLogicalDrives, Move,
    SetCreationTime, SetCurrentDirectory
  • DirectoryInfo (System.IO)
  • definuje
  • vlastnosti, napr. Attributes, CreationTime,
    Exists, Extension, Name
  • instancní metody, napr.Create,
    CreateSubDirectory, Delete, GetDirectories,
    GetFiles, MoveTo

27
Trída Path
  • Statická trída, která provádí operace nad
    retezci, jež obsahují informace o adresárových
    (soubo-rových) cestách
  • Definuje statické metody, napr.
  • ChangeExtension mení príponu
  • Combine vytvárí z pole retezcu cestu
  • GetExtension vrací príponu
  • GetFileName vrací jméno a príponu
  • GetFileNameWithoutExtension vrací jméno
    bez prípony
  • GetRandomFileName vrací náhodné jméno
    souboru nebo adresáre

28
Serializace, deserializace (1)
  • Serializace
  • predstavuje uchování stavu objektu
  • proces konvertování datových struktur nebo
    objektu uložených ve vnitrní pameti na
    posloupnost bytu, kterou lze následne uložit do
    nejakého úložište (napr. soubor, databáze),
    prípadne prenést sítí
  • Deserializace
  • opacný proces k serializaci, tj. prevedení
    posloup-nosti bytu na kopii puvodního objektu
  • Pomocí serializace je možné napr. ukládat data
    aplikace, ukládat její nastavení nebo zasílat
    data prostrednictvím pocítacové síte

29
Serializace, deserializace (2)
  • .NET Framework umožnuje provádet ruzné ty-py
    serializací, napr.
  • binární
  • provádí serializaci v binárním formátu
  • zachovává datové typy (identitu instance)
  • na základe uložených dat je možné automaticky
    rekon-struovat puvodní objekt
  • možné realizovat pomocí trídy BinaryFormatter
  • SOAP
  • vhodná pro komunikaci mezi aplikacemi, které
    používají heterogenní architektury
  • možné realizovat pomocí trídy SoapFormatter

30
Serializace, deserializace (3)
  • XML
  • provádí serializaci do formátu XML
  • serializuje pouze verejné vlastnosti a datové
    položky
  • nezachovává datové typy
  • možné realizovat pomocí trídy XmlSerializer

31
Trída XmlSerializer (1)
  • Definována ve jmenné prostoru System.Xml.Serializa
    tion
  • Umožnuje serializaci (deserializaci) do (z)
    do-kumentu XML
  • Dovoluje ovládat, jakým zpusobem jsou objekty
    kódovány
  • Trída, jejíž objekty chceme serializovat musí
  • obsahovat bezparametrický konstruktor, popr.
    žádný parametrický konstruktor
  • být definována s prístupností public

32
Trída XmlSerializer (2)
  • Pri vytvárení instance trídy XmlSerializer (v
    dobe volání konstruktoru) se jako parametr
    predává typ objektu, jež budou serializovány
    (deserializovány)
  • Poznámka
  • predávaný datový typ se specifikuje pomocí
    operá-toru typeof, popr. pomocí metody GetType
  • Trída XmlSerializer poskytuje metody
  • Serialize
  • provede serializaci objektu prostrednictvím
    potomka trídy Stream, TextWriter nebo XmlWriter

33
Trída XmlSerializer (3)
  • Deserialize
  • provede deserializaci objektu
  • vrácená hodnota je typu object
  • Pri serializaci pomocí trídy XmlSerializer je
    možné využít ruzné atributy, napr.
  • XmlIgnore
  • vlastnost nebo datová položka, pred níž je tento
    atribut uveden, nebude serializována
  • XmlAttribute(Name)
  • provede zmenu z párové znacky na nepárovou
  • hodnota vlastnosti (datové položky) bude uvedena
    v atri-butu Name

34
Trída XmlSerializer (4)
  • Serializaci do formátu XML lze také realizovat
    pomocí trídy DataContractSerializer
  • dovoluje serializaci i neverejných clenu
    (vlastností a datových položek)
  • trída, jejíž objekty mají být serializovány, musí
    být oznacena atributem DataContract
  • cleny, které se budou serializovat musí být
    oznaceny atributem DataMember
  • poskytuje metody
  • WriteObject
  • provede zápis do XML dokumentu nebo proudu
  • ReadObject
  • provede nactení dat z XML dokumentu nebo proudu

35
Trída BinaryFormatter (1)
  • Definována ve jmenné prostoru System.Runtime.Seria
    lization.Formatters.Binary
  • Provádí serializaci (deserializaci) do (z)
    binár-ního formátu
  • Trída, jejíž objekty chceme serializovat, musí
  • mít pred svou definicí specifikovaný atribut
    Serializable
  • obsahovat pouze serializovatelné cleny (výjimku
    tvorí datové položky, u nichž je použitý atribut
    NonSerialized)

36
Trída BinaryFormatter (2)
  • Konstruktoru se nepredává informace o typu
    serializovaných objektu
  • Poskytuje metody
  • Serialize
  • provede serializaci objektu do zadaného proudu
    (potomek trídy Stream)
  • Deserialize
  • provede deserializaci objektu ze zadaného proudu
  • vrácená hodnota je typu object

37
JSON serializace (1)
  • Serializaci (deserializaci) do (z) notace JSON
    (JavaScript Object Notation) lze ucinit pomocí
    trídy DataContractJsonSerializer
  • V dobe volání konstruktoru se predává typ, je-hož
    objekty budou serializovány
  • Trída DataContractJsonSerializer poskytuje
    metody
  • WriteObject
  • provede serializaci do notace JSON
  • ReadObject
  • provede deserializaci z notace JSON

38
JSON serializace (2)
  • JSON serializaci je možné realizovat i pomocí
    trídy JsonConvert
  • nutné nainstalovat balícek Json.NET
    (http//www.newtonsoft.com/json)
  • trída je definována ve jmenném prostoru
    Newtonsoft.Json
  • poskytuje metody
  • SerializeObject
  • vrací serializovaný objekt jako retezec (string)
  • DeserializeObject
  • na základe zadaného retezce a parametrizovaného
    typu objektu provede deserializaci
Write a Comment
User Comments (0)
About PowerShow.com