View on GitHub

maturavorbereitung-2020_21

Fragenkatalog zur Matura in Programmieren (Abendschule) 2020/21

Collections and Generics

Inhalt

Generische Methoden und Klassen

Generics Bedeutung

Generisch bedeutet im Allgemeinen gültigen Sinne.

Motivation:

Man versucht folgende vier “Hauptziele” zu erreichen:

#### Vorteile gegenüber der verwendung der allgemein Objekt-Klasse

Generische Klassen

‘T’oder ‘E’ werden im Allgemein als die generische Typevariablen verwendent. Bei der Folgende Zeile wird gezeigt, wie eine generische Klasse aufgebaut ist.

access_modifer class ident <T,K> // T, K generic datatType

Generische Typen können in internen Fields, Properites und Methoden einer Klasse verwendet werden.

public  class Kunde<T>  //TKundenInfo anstelle von T
{                       //wäre geeigneter 
    private static List<T> _kundenListe;
    private T _kundenInfo;
    public T KundenInfo{ get; set; };
    public int VerlgleicheKunden(T KundenInfo);
}

Bei der Verwendung von generischen Typen ist als es ob man irgend einen anderen nichtgenerischen Typ verwendet. Die Typ-Parameter müssen lediglich bei der Instanzierung gesetzt werden.

LinkedList<string> myList = new LinkedList<string>();

Constraints in C#

Das “Keyword”, where bietet Beschränkungen für einen Typ-Parameter. Es kann auch eine Basisklasse oder ein Interface verwendet werden als Einschränkung.

Beispiel:

public class MyGenericClass<T> where T : IComparable<T> { }

Weitere Beispiele:

public class SortedList<T> where T : IEnumerable, IConeable { }

Hier muss die die Klasse MyGenericClass als Einschränkung das IComarableInterface implementieren. Also ein ‘Vertrag’ schreibt vor dass der Typ T ‘vergleichbar’ sein muss gemäß dem Interface.

Einen Default Wert verwenden

Das “Keyword” default Wenn T ein Referenztyp ist dann ist defaut(T) null; Für Werttypen wie zum Beispiel int, float, hier werden alle Bits werden auf 0 gesetzt.

Was sind Collections?

Collections sind aufzählbare Datenstrukturen die ausgewertet werden können indem man Indexe oder Schlüssel (Keys) verwendet. Datenstrukturen welche nahe in Relation stehen können effizienter gehandhabt werden in einer Collection. Ich interpertiere diesen Satz aus der Microsoftdokumentation so, dass Vorgefertige Collections von .Net wie List sehr performant von einem Array überführ werden können. Anstelle für jede Datenstruktur bzw. Datentyp seperaten Code zu schreiben kann man den gleichen Code wiederverwenden um alle Elemente in einer Colletion zu verarbeiten.

Einsatz von Generics in Collections

Interface Beschreibung
ICollection(T) Definiert Methoden
um generische Collections zu manipulieren
IList(T) Repräsentiert eine Collection
die über einen Index zugreifen können
IEnumerator(T) Unterstützt eine einfache Iteration
über eine generische Collection
IDictionary(TKey, TValue) Repräsentiert eine generische Collection
eines Key/Value pair
IComparer(T) Definert eine Methode die
zwei Objekte vergleicht

Arten von generischen Collections als Datenstruktur

List <T>

Ist eine typisierte Liste über die auch mittels einem Index zugegriffen werden.

Beispiel:

public static void Main(string[] args)
{
    List<int> myintegers = new List<int>();
    myintegers.Add(1);
    myintegers.Add(2);
    myintegers.Add(3);
    
    foreach (int i in myintegers)
    {
        Console.Write("${i.ToString()} "); // 1 2 3
    }
}

List <T> hat auch eine Sort Methode welche die Werte entweder spezifiziert mittels einem angegebenen IComparer bzw. IComparable oder ansonsten mittels einem default comparer sortiert. Die Klasse als Parameter muss das ICompareable<T> interface impementieren.

Beispiel:

    class Pupil : IComarable<Pupil>
    {
        private string _FirstName;
    }

IComparable Inteface

Die Klasse muss das CompareTo() Interface implementieren. Das heißt es wird ein Objekt vom gleichen Typ als Parameter übergeben.

public class Rectangel: IComparable { private int _length, _width, _area; .... public int Area() { _area = length * width return _area;; }

public int CompareTo (Rectangel other)
{
    if(this._area < other._area) return -1;
    else if (this._area > other.area) return 1;
    else return 0;
} } ~~~ ### Dictionary \<K,V> Speichert( Schlüssel, Wert); Wobei K (key) hier der Schlüssel ist und V (value) den Wert angibt. Der Schlüssel (Key) kann auch als Indexer verwendet werden bzw. dient als schnelle Suche beim Finden der Werte.

Beispiel:

 Dictionary<String, Pupil> allPupils = new Dictionary<String,Pupil>();
 Pupil x = allPupils["Müller"]; 
 Console.WriteLine("${x.Vorname} {X.Nachname} {x.Klasse}");

#### Weitere Methoden bzw. Indexerproperities:

Queues <T>

Warteschlange Hier handelt es sich um Warteschlangen vergleichbar mit einer Warteschlange an einer Supermarktkasse.

Die wichtigsten Methoden:

Linked List <T>

DoubleLinkedList
Eine generische Linked List erlaubt den sequenziellen Zugriff auf die einzelnen Elemente entweder von Seite des “Head” oder von Seite des “Tail”.

Die wichtigesten Methoden bzw. Properties:

var nodeTwo = linkedList.Find("two"); // find first node with value "two"
nodeThree = linkedList.FindLast("three"); // find last node with value "three"
var firstNode = linkedList.First; // get first node in list
var lastNode = linkedList.Last; // get last node in list
linkedList.Remove("two");  // remove the first node with value "two"
linkedList.RemoveFirst(); // remove first node in list
linkedList.RemoveLast(); // remove last node in list
linkedList.Clear(); // remove all items from list

SortedDictionary<K,V> SortedList<K,V>

Das SortdDictionary und die Sorted List sind ähnlich strukturiert wie ein gewöhlichtes Dictionary wobei diese sortiert werden anhand der Schlüssel.

HashSet<T>

Die HashSet<T> Klasse stellt hochperformante Vorgänge zu Verfügung. Das Set ist eine Auflistung, die keine doppelten Elemente enthält und wo diese sich in keiner Reihenfolge befinden. Neben den üblichen generischen Methoden wie Add, Count, Contains, Clear und vielen anderne verfügt die HashSet<T> Klasse auch viele Methoden die bekannt sind aus der Mengenlehre:

Quellen