|
|
Cvičenie 7
|
|
|
|
|
|
Vytvorte si dva nové projekty: Cv7 (console application) Cv7Lib (class library), nech sú obidve postavené na .NET framework
|
|
|
|
|
|
Konzolová aplikácia nám bude slúžiť len pre jednoduchšie zobrazenie dát, užívateľské rozhranie budeme vytvárať nabudúce.
|
|
|
|
|
|
## 1
|
|
|
|
|
|
V Cv7Lib si vytvorte triedu Employee, nech táto obsahuje verejne dostupné vlastnosti (properties) Name, Address, PhoneNumber, Salary (teda public getter & setter)
|
|
|
|
|
|
Vytvorte si triedu CompanyEmployees ktorá bude v sebe obsahovať zoznam zamestnancov.
|
|
|
|
|
|
Vytvorte pre tento zoznam prístupové funkcie: AddEmployee, GetEmployees
|
|
|
|
|
|
Následne pridajte funkciu `Employee FindEmployee (Func<Employee, bool> predicate)`
|
|
|
a `List<Employee> FindEmployees (Func<Employee, bool> predicate)`
|
|
|
|
|
|
Tieto funckie budú fungovať ako vyhľadávanie, kde `Func<Employee, bool>` by sme mohli nahradiť zápisom:
|
|
|
|
|
|
```csharp
|
|
|
delegate TResult System.Func<in T, out TResult>(T arg)
|
|
|
|
|
|
delegate bool System.Func<in Employee, out bool>(int predicate)
|
|
|
|
|
|
```
|
|
|
|
|
|
Toto predstavuje signatúru anonymnej funkcie, ktorá bude mať jeden vstupný parameter typu Employee a návratovú hodnotu typu bool. Všetky vymenované typové parametre, okrem posledného predstavujú vstupy a posledný parameter je návratová hodnota.
|
|
|
|
|
|
Niekoľko príkladov:
|
|
|
|
|
|
```csharp
|
|
|
Func<int, int> addOne = x => x + 1; //x je implicitne deklarovaná premenná - vstupný parameter
|
|
|
//tento lambda výraz je totožný s nasledujúcou funkciou
|
|
|
int AddOne(int x)
|
|
|
{
|
|
|
return x + 1;
|
|
|
}
|
|
|
//---------------------------------------------------
|
|
|
Func<int, int, int> addValues = (a, b) => a + b;
|
|
|
|
|
|
int AddValues(int a, int b)
|
|
|
{
|
|
|
return a + b;
|
|
|
}
|
|
|
//---------------------------------------------------
|
|
|
Func<int, int, bool> compareValues = (a, b) => a > b;
|
|
|
|
|
|
bool CompareValues(int a, int b)
|
|
|
{
|
|
|
return a > b;
|
|
|
}
|
|
|
```
|
|
|
|
|
|
Ako ale tieto metódy implementovať?
|
|
|
|
|
|
- pridajte si `using System.Linq;`
|
|
|
- toto nám umožní používať takzvané extension methods nad kolekciami, tieto nám umožňujú, okrem iného filtrovať a transformovať kolekcie. Takéto metódy sú napr. Where a First. Keď si všimnete, tieto očakávajú ako parameter práve lambda funkciu so signatúrou popísanou vyššie.
|
|
|
|
|
|
```csharp
|
|
|
Func<Employee, bool> predicate = e => e.Name.Length > 15;
|
|
|
List<Employee> employeesWithLongName = employees.Where(predicate).ToList(); //ToList() nám vytvorí nový zoznam s týmito hodnotami
|
|
|
|
|
|
//alternatíva 2:
|
|
|
List<Employee> employeesWithLongName = employees.Where(e => e.Name.Length > 15).ToList();
|
|
|
```
|
|
|
|
|
|
V konzolovej aplikácií si pridajte knižnicu do referencií - keď máte v solution explorer zvolený projekt s konzolou, choďte na Project -> Add Reference..., prípadne kliknite pravým tlačidlom na references a Add Reference... tu si v záložke project zaškrtnite Cv7Lib. Teraz bude naša knižnica referencovaná v rámci konzolovej aplikácie a vieme ju použiť.
|
|
|
|
|
|
V Main si vytvorte CompanyEmployees a pridajte tam niekoľko zamestnancov (možete priamo v kóde, toto je cvičná úloha, nemusíte čítať z obrazovky), do triedy Employee ešte pridajte ToString() nech vieme spraviť výpis do konzoly.
|
|
|
|
|
|
V Main napíšte lambda výraz, pomocou ktorého nájdete zamestnancov, ktorí majú plat vyšší ako určitá suma, vypíšte ich na obrazovku.
|
|
|
|
|
|
## 2
|
|
|
|
|
|
V Cv7Lib si pridajte triedu CsvFile, táto trieda bude slúžiť na čítanie a zápis do CSV súboru.
|
|
|
|
|
|
Pridajte si dve funkcie - `void SaveToFile(List<Employee> employees, string path);` a `List<Employee> ReadFromFile(string path)`
|
|
|
|
|
|
.NET framework definuje rozhranie IDisposable, toto rozhranie nám zabezpečuje, že ak pracujeme s vecou, ktorá toto implementuje, tak po ukončení práce si táto vec automaticky po sebe uprace, teda ak takýmto spôsobom pracujeme so súborom, nemusíme sa starať, či bol súbor na konci zavretý (a máme garantované, že sa zavrie aj ak program skončí chybou).
|
|
|
|
|
|
Použitie tohoto rozhrania je pomocou kľúčového slova using:
|
|
|
|
|
|
```csharp
|
|
|
using(StreamWriter sw = new StreamWriter(@"C:\textFile.txt"))
|
|
|
{
|
|
|
sw.WriteLine("It works!");
|
|
|
}
|
|
|
```
|
|
|
|
|
|
viac príkladov na zápis:
|
|
|
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/file-system/how-to-write-to-a-text-file
|
|
|
|
|
|
čítanie zo súboru:
|
|
|
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/file-system/how-to-read-from-a-text-file
|
|
|
|
|
|
CSV súbory:
|
|
|
https://en.wikipedia.org/wiki/Comma-separated_values
|
|
|
|
|
|
|
|
|
Následne:
|
|
|
1. Pridajte si do Employee metódu `string ToCSVLine()` ktorá vytvorí zo záznamu riadok do CSV súboru
|
|
|
2. Pridajte si do CsvFile `private Employee CreateEmployee(string csv)` tu rozdeľte riadok z CSV súboru na jednotlivé hodnoty a vytvorte pomocou nich nového zamestnanca. Na rozdelenie hodnôt použite `String.Split(',')`
|
|
|
3. Upravte CompanyEmployees tak aby akceptoval zoznam zamestnancov načítaný so súboru.
|
|
|
4. Pridajte si v CompanyEmployees kolekciu typu Dictionary kde uložíte vedúcich zamestnancov vo firme, ako kľúč použite názov pozície.
|
|
|
|
|
|
Ako na dictionary: https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.dictionary-2?view=netframework-4.8 |
|
|
\ No newline at end of file |