Add a C# course with a side-by-side code runner.

Each lesson explains a topic and runs the edited program next to the text through the local .NET SDK.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
pepaskopec-blip 2026-10-11 14:37:14 +02:00
commit 333085ee53
86 changed files with 2482 additions and 5 deletions

View file

@ -0,0 +1,4 @@
---
nazev: Exceptions
popis: An error you can catch and explain.
---

View file

@ -0,0 +1,43 @@
---
id: cs-4-vyjimky
nazev: Výjimky
popis: Chyba, kterou lze chytit a vysvětlit.
---
# Výklad
## try
*pokus*
- try je kus, který může spadnout.
- catch (Exception e) ho chytí, místo aby spadl celý program.
- e.Message je text chyby.
> Tip: Bez try by Parse na textu abc program ukončil.
## finally
*vždy*
- finally se spustí, ať try prošel, nebo ne.
- Hodí se na úklid. V příkladu jen vypíše, že končíme.
- catch může být víc, pro různé typy chyb.
> Tip: Změňte abc na 5. catch se přeskočí, finally ne.
# Kód
```
try
{
int n = int.Parse("abc");
Console.WriteLine(n);
}
catch (Exception e)
{
Console.WriteLine("Chyba: " + e.Message);
}
finally
{
Console.WriteLine("konec");
}
```

View file

@ -0,0 +1,4 @@
---
nazev: List
popis: A list that can grow.
---

View file

@ -0,0 +1,39 @@
---
id: cs-4-list
nazev: List
popis: Seznam, který umí růst.
---
# Výklad
## Přidávání
*Add*
- List<string> začne prázdný. Add přidá na konec.
- Count je počet. Indexy jsou zase od nuly.
- Na rozdíl od pole délku dopředu neříkáte.
> Tip: List<string> potřebuje špičaté závorky s typem prvku.
## Odebrání
*Remove*
- Remove("Eva") odebere první Evu.
- RemoveAt(0) odebere podle indexu.
- foreach pak projde, co zůstalo.
> Tip: Přidejte třetí jméno před odebráním.
# Kód
```
List<string> jmena = new List<string>();
jmena.Add("Anna");
jmena.Add("Eva");
jmena.Remove("Eva");
foreach (string j in jmena)
{
Console.WriteLine(j);
}
Console.WriteLine(jmena.Count);
```

View file

@ -0,0 +1,4 @@
---
nazev: Dictionary
popis: A value under a key.
---

View file

@ -0,0 +1,39 @@
---
id: cs-4-slovnik
nazev: Slovník
popis: Hodnota pod klíčem.
---
# Výklad
## Klíč
*jednou*
- Dictionary<string, int> má klíč text a hodnotu číslo.
- znamky["Anna"] = 1 uloží nebo přepíše.
- Stejný klíč je v slovníku jen jednou.
> Tip: Pole je podle čísla. Slovník je podle jména, které si zvolíte.
## Čtení
*ContainsKey*
- Čtení chybějícího klíče spadne.
- ContainsKey napřed zjistí, jestli klíč je.
- foreach projde dvojice Key a Value.
> Tip: Zeptejte se na jméno, které v slovníku není, až po ContainsKey.
# Kód
```
Dictionary<string, int> znamky = new Dictionary<string, int>();
znamky["Anna"] = 1;
znamky["Eva"] = 2;
znamky["Anna"] = 3;
if (znamky.ContainsKey("Eva"))
{
Console.WriteLine(znamky["Eva"]);
}
Console.WriteLine(znamky["Anna"]);
```

View file

@ -0,0 +1,4 @@
---
nazev: LINQ
popis: Queries over a list.
---

View file

@ -0,0 +1,36 @@
---
id: cs-4-linq
nazev: LINQ
popis: Dotazy nad seznamem.
---
# Výklad
## Where
*filtr*
- Where nechá jen prvky, které splní podmínku.
- n => n >= 10 je krátká funkce: vezmi n a vrať, jestli je aspoň 10.
- Samotné Where ještě nic neprojde. ToList nebo foreach výsledek vezme.
> Tip: Šipka => není porovnání. Je to zápis malé funkce.
## Select
*převod*
- Select z každého prvku udělá jiný.
- OrderBy seřadí.
- Dotaz lze řetězit: Where a pak Select.
> Tip: Změňte 10 na 12 a dvojka z výpisu zmizí.
# Kód
```
int[] cisla = { 4, 11, 7, 20 };
var velka = cisla.Where(n => n >= 10).OrderBy(n => n);
foreach (int n in velka)
{
Console.WriteLine(n);
}
```

View file

@ -0,0 +1,4 @@
---
nazev: Files
popis: Writing and reading text.
---

View file

@ -0,0 +1,33 @@
---
id: cs-4-soubory
nazev: Soubory
popis: Zápis a čtení textu.
---
# Výklad
## WriteAllText
*jednou*
- File.WriteAllText zapíše celý soubor. Když existuje, přepíše ho.
- Cesta pozdrav.txt je vedle programu, v jeho složce.
- ReadAllText celý text vrátí jako string.
> Tip: Na telefonu se soubor nespustí. Na počítači s .NET ano.
## Řádky
*Append*
- AppendAllText přidá na konec a soubor nesmaže.
- ReadAllLines vrátí pole řádků.
- Po skončení programu soubor ve složce laboratoře zůstane.
> Tip: Spusťte dvakrát. Druhý zápis WriteAllText starý text nahradí.
# Kód
```
File.WriteAllText("pozdrav.txt", "Ahoj ze souboru");
string zpet = File.ReadAllText("pozdrav.txt");
Console.WriteLine(zpet);
```

View file

@ -0,0 +1,4 @@
---
nazev: Generics
popis: One method for several types.
---

View file

@ -0,0 +1,37 @@
---
id: cs-4-generika
nazev: Generika
popis: Jedna metoda pro víc typů.
---
# Výklad
## T
*typový parametr*
- static void Vypis<T>(T hodnota) přijme int i string.
- T se doplní při volání podle argumentu.
- Jedna metoda tak nenutí kopírovat kód pro každý typ.
> Tip: Když metoda s T má umět jen porovnávat, T se omezí. Tady stačí výpis.
## List
*už ho znáte*
- List<string> je generická třída. string je dosazený T.
- Stejný List<int> drží čísla a metody jsou stejné.
- Generika hlídá typ. Do List<int> string nedáte.
> Tip: Zavolejte Vypis s číslem i s textem.
# Kód
```
Vypis(7);
Vypis("ahoj");
static void Vypis<T>(T hodnota)
{
Console.WriteLine(hodnota);
}
```

View file

@ -0,0 +1,4 @@
---
nazev: Delegates
popis: A variable that holds a method.
---

View file

@ -0,0 +1,34 @@
---
id: cs-4-delegaty
nazev: Delegáty
popis: Proměnná, do které uložíte metodu.
---
# Výklad
## Func
*funkce*
- Func<int, int> je metoda, která dostane int a vrátí int.
- x => x * x je taková metoda bez jména.
- Do proměnné ji uložíte a zavoláte později.
> Tip: Závorky pocet(4) metodu spustí. Bez nich byste ji jen předali dál.
## Action
*bez výsledku*
- Action nic nevrací. Hodí se na kroky.
- Metodu můžete předat jiné metodě jako argument.
- Tak se píše i Where z minulé lekce.
> Tip: Vyměňte x * x za x + 1.
# Kód
```
Func<int, int> pocet = x => x * x;
Console.WriteLine(pocet(4));
Action pozdrav = () => Console.WriteLine("ahoj");
pozdrav();
```

View file

@ -0,0 +1,4 @@
---
nazev: Async and await
popis: Work that waits without freezing the way you write it.
---

View file

@ -0,0 +1,33 @@
---
id: cs-4-async
nazev: Async a await
popis: Práce, která počká, aniž by zamkla zbytek zápisu.
---
# Výklad
## await
*počkej*
- await Task.Delay čeká, ale zápis zůstane řádek za řádkem.
- Metoda s await má v hlavičce async a vrací Task.
- V krátkém programu smí await stát i na nejvyšší úrovni.
> Tip: Delay(300) čeká 300 milisekund. Výpis hotovo přijde až po něm.
## Task
*slib*
- Task je slib, že práce doběhne.
- await slib rozbalí. Bez await byste měli slib, ne výsledek.
- Na síť a soubory se await hodí. Na 2 + 2 ne.
> Tip: Dejte za první výpis ještě jeden await a druhý řádek.
# Kód
```
Console.WriteLine("začátek");
await Task.Delay(300);
Console.WriteLine("hotovo");
```