Jazyk C# (seminář 3) Pavel Procházka KMI 15. října 2014
Motivace Představme si problém, jak napsat seznam v C# class IntList{... int value; public void IntList( int val, List next ){... V čem je to nevýhodné?
Řešení číslo 1 Můžeme to vyřešit pomocí vestavěné třídy object (od té ve skutečnosti dědí implicitně všechny třídy). class GeneralList{... object value; public void GeneralList( object val, List next ){... Jaká je nevýhoda tohoto řešení? (Nápověda: Typy)
Řešení generikami Typ, který má nést seznam specifikujeme pomocí dodatečného argumentu. class List<T>{ public T list_value; public List <T> next; public List ( T v, List <T> next ){ list_value = v; this.next = next;... List <int> l = new List<int>( 6, new List<int> ( 7, null ));
Syntaxe generik ve zkratce Tam, kde se díváme na generický typ jako na argument, tam dáváme <,> Pokud ten typ potřebujeme použít k vytvoření proměnné nebo jako argument, pak zobáčky nedáváme Nevýhoda (a současně výhoda) generik je ta, že do datové struktury můžeme ukládat pouze objekty stejného typu.
Pole v C# Syntaxi už známe Rozlišujeme jednorozměrná pole, vícerozměrná pole a jagged pole Pole je jenom implementovaný interface IEnumerable Pole je objekt a má mnoho zajímavých metod a veřejných členských proměnných prostudujte si je, například Length, Clone, CopyTo apod.
Kolekce Je to interface, který slouží k tomu, že na libovolný objekty, který implementuje kolekci, lze použít foreach Podívejte se, jak se tento interface implementuje http://msdn.microsoft.com/cs-cz/library/system. collections.ienumerable(v=vs.110).aspx Všimněte si metody GetEnumerator speciální metoda, která vrací postupně položky datové struktury Tato metoda slouží pro foreach GetEnumerator často používá klíčové slovo yield return, což je return, který si ale pamatuje stav funkce a při dalším zavolání se proměnné ve funkci pamatují z předchozího volání (jakoby proměnné byly static ve smyslu jazyka C)
Implementované kolekce v jazyku C# Dictionary<TKey, TValue> drží položky ve tvaru klíč/hodnota přistupuje se klíčem, nezáleží na pořadí List<T> klasický spojový seznam Queue<T> fronta SortedList<TKey, TValue> položky klíč/hodnota jsou setřízeny podle klíče Stack<T> zásobník new Hashtable(); hashovací tabulka klíč/hodnota Prohlédněte si metody těchto kolekcí na MSDN, zejména Add, Remove
Příklad na použití slovníkových kolekcí Dictionary<string, string> openwith = new Dictionary<string, string>(); openwith.add("txt", "notepad.exe"); openwith.add("bmp", "paint.exe"); openwith.add("dib", "paint.exe"); openwith.add("rtf", "wordpad.exe"); openwith["sh"] = "bash"; Console.WriteLine ("Open with: {0", openwith ["txt"]); /* prochazeni */ foreach( KeyValuePair<string, string> kvp in openwith ) { Console.WriteLine("Key = {0, Value = {1", kvp.key, kvp.value);
Běžně používané metody string.concat spojování řetěců, string je statická třída Split rozděluje objekt typu string na pole řetězců Trim odřeže od konce a od začátku bílé znaky (používá se dost na webu) IndexOf index, na kterém se nachází řetězec v řetězci Replace nahradí všechny výskyty řetězce Spojování řetězců pomocí operátoru + Srovnávání řetězců pomocí operátoru ==, <=, >,... Regulární výrazy viz. http://msdn.microsoft.com/en-us/library/ system.text.regularexpressions.regex(v=vs.110).aspx
Proměnný počet argumentů Nové klíčové slovo params public static double Average( params int[] values ){ int sum = 0; foreach (int v in values) { sum += v; return sum / values.length;... Console.WriteLine( "avg: {0", Average(1,2,3) ); => 2 Console.WriteLine( "avg: {0", Average(new int[]{1,2,3 );?? => 2 :)
A ted vy Napište třídu TextStatistic, která má za úkol provádět statistiku text Bude obsahovat metody Dictionary<string, int> GetStatistic(), která vrací slovník, kde klíč je slovo a hodnota je počet výskytů. Dictionary zkuste vyměnit za další kolekce a zjistěte, jak je to s rychlostí. Napište metodu string [] GetWordsWithOccurence( int n ), která vrátí všechny řetězce, které se vyskytují n-krát Pro ty, co budou stíhat Napište třídu MySet, která bude reprezentovat matematickou množinu. Metody si určete sami podle intuice Napište metodu MySet PowerSet(), která vrátí potenční množinu. Implementujte IEnumerator