Skip to content

Commit 060946b

Browse files
committed
chapter 1-6 minor update
1 parent afef00a commit 060946b

File tree

6 files changed

+174
-113
lines changed

6 files changed

+174
-113
lines changed

docs/seminar/01-csharp1/chapter1.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,3 +340,26 @@ Nem kell az `Add` függvényhívást és a lista referenciát kiírni, egyértel
340340
Ez a forma is ugyanolyan `Add` függvényhívásokra fordul, mint az eredeti változatban.
341341

342342
Próbáljuk ki az alkalmazást! Láthatjuk, hogy a konstruktoron keresztül teljesen inicializálható `Person` példányok esetében a kiírás teljes, viszont vannak olyan `Student` példányok, ahol a kiírás üres értékeket talál. Ezzel a jelenséggel a következő gyakorlatokon tovább foglalkozunk.
343+
344+
C# új verziójában megjelent a Collection Expression szintaxis is, amivel a kollekció inicializálás még egyszerűbbé válik, aminek a szintaxisa a `[]` között megadott elemekből áll. Itt nem kell megadni a típust sem, a fordító automatikusan kitalálja azt a bal oldalból, és működik a legtöbb kollekció típussal és tömbbel is.
345+
346+
```csharp hl_lines="1-2 12"
347+
List<Person> people =
348+
[
349+
new Person("Horváth Aladár", new DateTime(1991, 06, 10)),
350+
new Person("Kovács István", new DateTime(1994, 04, 22)),
351+
new Person("Kovács Géza", new DateTime(1998, 03, 16)),
352+
new Student("Fel Elek", new DateTime(2002, 06, 10))
353+
{
354+
Neptun = "ABC123",
355+
Major="Info BSc"
356+
},
357+
new Student("Hiány Áron", new DateTime(2000, 02, 13))
358+
];
359+
```
360+
361+
Továbbá van lehetőség kollekciók összefűzésére is a `..` operátorral.
362+
363+
```csharp
364+
List<Person> people2 = [ .. people, new Person("Kovács Béla", new DateTime(1995, 01, 01)) ];
365+
```

docs/seminar/02-csharp2/chapter2.md

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ dotnet <projektnév.dll>
4747
```
4848

4949
!!! tip "Parancssor aktuális mappája"
50-
A dotnet parancshoz a dll könyvtárában kell lennünk. Ehhez a legegyszerűbb, ha a Windows fájlkezelőben a megfelelő könyvtárban állva az elérési útvonal mezőt átírjuk a `cmd` szövegre, majd kbd:\[ENTER\]-t nyomunk.
50+
A dotnet parancshoz a dll könyvtárában kell lennünk. Ehhez a legegyszerűbb, ha a Windows fájlkezelőben a megfelelő könyvtárban állva az elérési útvonal mezőt átírjuk a `cmd` szövegre, majd ++enter++-t nyomunk.
5151

5252
Adjunk a létrejövő projekthez egy `Dog` osztályt *Dog.cs* néven, ez lesz az adatmodellünk:
5353

@@ -87,7 +87,7 @@ Ebben az esetben a típus egyértelműen `Dog`.
8787
Ha csak deklarálni szeretnénk egy változót (nem adunk értékül a változónak semmit), akkor nem használhatjuk a `var` kulcsszót, ugyanis nem következik a kódból a változó típusa.
8888
Ekkor explicit meg kell adnunk a típust.
8989

90-
``` csharp hl_lines="5-10"
90+
``` csharp hl_lines="6-11"
9191
Dog banan = new Dog
9292
{
9393
Name = "Banán",
@@ -97,15 +97,15 @@ var watson = new Dog { Name = "Watson" };
9797

9898
var unnamed = new Dog { DateOfBirth = new DateTime(2017, 02, 10) };
9999
var unknown = new Dog { };
100-
//watson = 3; //
101-
//var error; //
100+
//watson = 3; // (1)
101+
//var error; // (2)
102102
103103
Console.WriteLine(banan);
104104
Console.ReadLine();
105105
```
106106

107-
* Fordítási hiba: a `watson` deklarációjakor eldőlt, hogy ő `Dog` típus, utólag nem lehet megváltoztatni és például számértéket értékül adni. Ez nem JavaScript.
108-
* Fordítási hiba: implicit típust csak úgy lehet deklarálni, ha egyúttal inicializáljuk is. Az inicializációs kifejezés alapján dől el (implicit) a példány típusa.
107+
1. Fordítási hiba: a `watson` deklarációjakor eldőlt, hogy ő `Dog` típus, utólag nem lehet megváltoztatni és például számértéket értékül adni. Ez nem JavaScript.
108+
2. Fordítási hiba: implicit típust csak úgy lehet deklarálni, ha egyúttal inicializáljuk is. Az inicializációs kifejezés alapján dől el (implicit) a példány típusa.
109109

110110
Próbáljuk ki a nem forduló sorokat, nézzük meg a fordító hibaüzeneteit!
111111

@@ -180,8 +180,8 @@ public class Dog
180180
public Dictionary<string, object> Metadata { get; } = new();
181181
public object this[string key]
182182
{
183-
get { return Metadata[key]; }
184-
set { Metadata[key] = value; }
183+
get => Metadata[key];
184+
set => Metadata[key] = value;
185185
}
186186
}
187187
```
@@ -217,7 +217,9 @@ var dogs = new Dictionary<string, Dog>
217217
};
218218

219219
foreach (var dog in dogs)
220+
{
220221
Console.WriteLine($"{dog.Key} - {dog.Value}");
222+
}
221223
```
222224

223225
Próbáljuk ki - minden név-kutya párt ki kell írnia a szótárból.
@@ -236,7 +238,9 @@ var dogs = new Dictionary<string, Dog>
236238
//ArgumentNullException!
237239
```
238240

239-
Ez azonban kivételt okoz, amikor a kutya neve nincs kitöltve, azaz `null` értékű. Esetünkben elég lenne az adott változó neve szövegként. Erre jó a `nameof` operátor.
241+
Ez azonban kivételt okoz, amikor a kutya neve nincs kitöltve, azaz `null` értékű.
242+
Esetünkben elég lenne az adott változó neve szövegként.
243+
Erre jó a `nameof` operátor.
240244

241245
``` csharp
242246
var dogs = new Dictionary<string, Dog>
@@ -253,7 +257,8 @@ Ez a változat már nem fog kivételt okozni.
253257

254258
A `nameof` operátor sokfajta nyelvi elemet támogat, vissza tudja adni egy változó, egy típus, egy property vagy egy függvény nevét is.
255259

256-
A szótár feltöltését megírhatjuk kollekció inicializációval is. Ehhez kihasználjuk, hogy a szótár típus rendelkezik egy `Add` metódussal, amelyik egyszerűen egy kulcsot és egy hozzátartozó értéket vár:
260+
A szótár feltöltését megírhatjuk kollekció inicializációval is.
261+
Ehhez kihasználjuk, hogy a szótár típus rendelkezik egy `Add` metódussal, amelyik egyszerűen egy kulcsot és egy hozzátartozó értéket vár:
257262

258263
``` csharp
259264
var dogs = new Dictionary<string, Dog>

docs/seminar/03-linq/chapter3.md

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,14 @@ static List<Dog> ListDogsByNamePrefix(IEnumerable<Dog> dogs, string prefix)
5353

5454
Próbáljuk ki!
5555

56-
A kód működik, viszont nem újrahasznosítható.
56+
A kód működik, viszont nem újrahasznosítható.
5757
Ha bármi más alapján szeretnénk keresni a kutyák között (pl. a neve tartalmaz-e egy adott szövegrészt), mindig egy új segédfüggvényt kell készítenünk, ami rontja a kód újrahasznosíthatóságát.
5858

5959
Oldjuk meg úgy, hogy az általános problémát is megoldjuk!
6060
Ehhez az szükséges, hogy a kollekciónk egyes elemein kiértékelhessünk egy, a hívó által megadott predikátumot.
6161
Készítsük el az általánosabb változatot, ehhez felhasználhatjuk a `ListDogsByNamePrefix` kódját.
6262

63-
``` csharp hl_lines="1 6"
63+
``` csharp hl_lines="2 7"
6464
static List<Dog> ListDogsByPredicate(
6565
IEnumerable<Dog> dogs, Predicate<Dog> predicate)
6666
{
@@ -182,7 +182,7 @@ namespace HelloLinq.Extensions.Enumerable;
182182

183183
public static class EnumerableExtensions
184184
{
185-
public static int Sum<T> (IEnumerable<T> source, Func<T, int> sumSelector)
185+
public static int Sum<T>(IEnumerable<T> source, Func<T, int> sumSelector)
186186
{
187187
var result = 0;
188188
foreach (var elem in source)
@@ -450,9 +450,13 @@ A fát kóddá fordíthatjuk a `Compile` metódus segítségével, mely a leford
450450
Console.WriteLine(e.Compile()(5));
451451
```
452452

453-
Bár az `Expression<>` emiatt okosabb választásnak tűnik, ám a LINQ-to-Objects alapinterfészének (ami a lekérdezőfüggvényeket biztosítja) függvényei `Func<>` / `Action<>` delegátokat várnak. Ami nem csoda, hiszen memóriabeli listákat általában sima programkóddal dolgozunk fel, nincs értelme felépíteni kifejezésfát csak azért, hogy utána egyből kóddá fordítsuk. Emellett más, memóriabeli adatokon dolgozó LINQ technológia is létezik, pl. LINQ-to-XML saját API-val (nem `IEnumerable<>` alaptípussal).
453+
Bár az `Expression<>` emiatt okosabb választásnak tűnik, ám a LINQ-to-Objects alapinterfészének (ami a lekérdezőfüggvényeket biztosítja) függvényei `Func<>` / `Action<>` delegátokat várnak.
454+
Ami nem csoda, hiszen memóriabeli listákat általában sima programkóddal dolgozunk fel, nincs értelme felépíteni kifejezésfát csak azért, hogy utána egyből kóddá fordítsuk.
455+
Emellett más, memóriabeli adatokon dolgozó LINQ technológia is létezik, pl. LINQ-to-XML saját API-val (nem `IEnumerable<>` alaptípussal).
454456

455-
A nem memóriabeli adatokon, hanem például külső adatbázisból dolgozó LINQ provider-ek viszont `IQueryable<>`-t valósítanak meg. Az `IQueryable<>` az `IEnumerable<>`-ból származik, így neki is vannak `Func<>` / `Action<>`-ös függvényei, de emellett `Expression<>`-ösek is. Ez utóbbiak teszik lehetővé, hogy ne csak .NET kódot generáljanak a lambda kifejezésekből, hanem helyette pl. SQL kifejezést - hiszen egy relációs adatbázis adatfeldolgozó nyelve nem .NET, hanem valamilyen SQL dialektus.
457+
A nem memóriabeli adatokon, hanem például külső adatbázisból dolgozó LINQ provider-ek viszont `IQueryable<>`-t valósítanak meg.
458+
Az `IQueryable<>` az `IEnumerable<>`-ból származik, így neki is vannak `Func<>` / `Action<>`-ös függvényei, de emellett `Expression<>`-ösek is.
459+
Ez utóbbiak teszik lehetővé, hogy ne csak .NET kódot generáljanak a lambda kifejezésekből, hanem helyette pl. SQL kifejezést - hiszen egy relációs adatbázis adatfeldolgozó nyelve nem .NET, hanem valamilyen SQL dialektus.
456460

457461
### A LINQ providerek általános működése
458462

@@ -462,4 +466,4 @@ Kimenetük: az adatforrásnak megfelelő nyelvű, a query-t végrehajtó kód (.
462466

463467
LINQ-to-Objects esetén nincs valódi LINQ provider (a provider az `IQueryable.Provider`-en keresztül érhető el, de a `List<>` nem `IQueryable`!), hiszen nincs feladata: kódot kap bemenetül, ugyanazt kellene kimenetül adnia. A *LINQ-to-XML* is hasonló elven működik.
464468

465-
Valódi LINQ providert valósít meg például az *Entity Framework*, de ezt a technológiát később tárgyaljuk.
469+
Valódi LINQ providert valósít meg például az *Entity Framework Core*, de ezt a technológiát később tárgyaljuk.

0 commit comments

Comments
 (0)