Hashtable in C#

Hashtables (Hash-Tabellen) sind Datenstrukturen, die den Arrays sehr ähnlich sind.
Hashtables können in C# ähnlich wie eine ArrayList verwendet werden, der Zugriff erfolgt über einen Index.
Der Index ist ein spezieller Key, welcher eine Zahl (z.B. vom Typ Float oder Integer) genauso wie ein String sein darf.

[csharp] // Beispiele, Syntax: hashtablename[key] = value;

ht_pass[32.3] = “juhu”;
ht_pass[5] = “tobias”;
ht_pass[“zoo”] = 45.3;
[/csharp]

Wozu werden Hashtables benötigt?

Hashtables sind sinnvoll, wenn sich Listen bzw. Arrays verknüpfen bzw. verschachteln lassen. So kann der Wert eines Listenfeldes der Schlüssel zu einem Wert eines anderen Feldes sein. Zwar ließe sich das auch mit einem normalen Array
(und somit Integer-Werten als Index) realisieren, dann wären jedoch einige zusätzliche Listen/Tabellen nötig, um von einer
Zahl auf einen speziellen Schlüssel und von diesem Schlüssel wieder auf eine anderen Zahlenschlüssel zu verweisen.

C# bietet natürlich einen gewissen Komfort bei Benutzung von Hashtables (wie bei vielen anderen Dingen auch). In der Programmiersprache C haben Programmierer eigene Hash-Funktionen entwickelt, um z.B. einen Text als Zahl umzuschlüsseln (z.B. “Hallo” -> “2342424”, “Schule” -> “792942” usw.), um diesen dann als Index (Schlüssel) für ein Array zu benuten. Vorteil: Um einen Wert zu suchen, musste nicht unbedingt das ganze Array durchlaufen und im
schlimmsten Falle alle Felder iteriert werden. Man musste sich nur die Schlüssel für bestimmte Werte merken, diese in eine Zahl konvertieren, auf den Wert im Feld mit dem Schlüssel zugreifen und es auslesen. Daraus ergibt sich ein sehr großer Geschwindigkeitsvorteil.
Der Nachteil liegt in der Größe des Arrays, dieses muss nämlich so groß sein bzw. so einen hohen Index haben, wie eine Zahl, die aus einem Text resultiert, werden kann. Außerdem könnte es vorkommen, dass Werte nicht abgespeichert werden können, da zwei oder mehrere unterschiedliche Texte trotz ausgereiften Algorithmus den selben Index ergeben. Ausweichmöglichkeiten sind zwar vorhanden (den Index verschieben, bis ein freies Feld gefunden wurde), macht die Sache jedoch trotzdem nicht viel unproblematischer.

Die Hashtables in C# sind weitaus dynamischer, denn intern ist ein Hahstable auch nur so groß, wie es notwendig ist. Der Zugriff ist jedoch absolut schnell, konstant schnell! Unabhängig von der Größe des Hashtable ist die Zugriffszeit konstant.

→ WEITERLESEN

Kategorien C#

Events in C#

Oft ist es notwendig, dass ein Quellcode ausgeführt wird, wenn ein Button geklickt, ein Programm gestartet oder ein Status erreicht wurde. In vielen Fällen liegt es hierbei an “fremden” Objekten, dass etwas passiert ist, dann soll jedoch entsprechend darauf reagiert werden. Eine Nachricht muss von diesem “fremden” Objekt empfangen werden, wenn das entsprechende Ereignis eintritt. Dieses Ereignis/Event ist der springende Punkt, es kann vom eigenen Programmcode (im Algorithmus oder durch Interaktion mit Benutzer oder Netzwerk) oder auch vom Betriebssystem ausgehen.

Das Betriebssystem und das Framework stellen sehr viele vorgefertigte Events zur Verfügung, welche nur abonniert werden müssen. Bei der Arbeit mit Windows.Forms wird das Ereignis des Button.Click beispielsweise häufig verwendet. Dieses wird z.B. von einem Button button1 wie folgt von der eigenen Klasse (welche auf das Ereignis reagieren soll) abonniert:

[csharp]

this.button1.Click += new System.EventHandler(this.button1_Click);

[/csharp]

Dabei wird eine Methode einem Delegate (Funktionszeiger) zugewiesen. Diese Methode heißt im Beispiel button1_Click, sie soll ausgeführt werden, wenn der button1 geklickt wird.

[csharp] private void button1_Click(object sender, EventArgs e)
{
\\ tu etwas
}
[/csharp]

Die Methode ist die Event-Reaktion. Wird das Event ausgeführt, also der Button geklickt, führt ein Funktionszeiger, der auf diese Methode zeigt, diese aus. Die Methode hat zwei Parameter (Pflichtparameter bei vom Framework vordefinierten Events), auf welche später weiter eingegangen wird.

Eventhandling

Tritt ein Objekt ein Event los, werden alle abonnierenden Objekte benachrichtigt. Bei Button.Click ist der Button das publizierende Objekt. Die Abonnenten können nach der Benachrichtigung, dass ein Event eingetreten ist, entsprechend reagieren. Wie die empfangenden Objekte auf das Ereignis reagieren, interessiert den Event-Publizierer nicht. Dabei wird eine 1-zu-n Beziehung angewandt, denn ein Publizierer kann sehr viele Abonnenten benachrichten.

→ WEITERLESEN

Kategorien C#

Delegate in C#

C# ist eine objektorientierte Programmiersprache, welche unsichere Elemente, wie etwa Zeiger (Pointer), grundsätzlich vermeidet. Dennoch sind Zeiger nicht nur in Augen von C/C++-Entwicklern in einigen Fällen einfach notwendig, so z.B. die Funktionszeiger.

Delegates sind Funktionszeiger in C#. Sie zeigen auf mindestens eine Funktion bzw. Methode. Benutzt wird ein Delegate in C# zum Beispiel für Events.

Ein Delegate wird in C# nach folgendem Schema definiert:

[Öffentlichkeitsparameter] delegate Rückgabewert Delegatename ([Methodenparametertyp Methodenparametername] );

Das Delegate weiß bereits im Vorfeld über die Parameter und dem Rückgabewert der Methode(n) bescheid, auf die es später verweisen soll.

Im nachfolgendem Beispiel ist ein Delegate in einer Klasse definiert, welches…
[csharp]

public delegate string FPointer (int index);

[/csharp]

→ WEITERLESEN

Kategorien C#

Foreach Schleife in C#

Die Foreach-Schleife ist eine mächtige Schleife für objektorientierte Programmiersprachen. Die Foreach-Schleife definiert eine Variable (im Beispiel item vom Typ string), welche als ein Stellvertreter eines jeden Elements eines Arrays oder einer Liste dient (Iterationsvariable).

Die Foreach-Schleife hat jedoch einen Nachteil gegenüber anderen Schleifen, denn das Array kann beim Zugriff über diese Schleife nicht in Größe und Inhalt verändert werden.

[csharp] ArrayList arrayList = new ArrayList();

arrayList.Add(“A”);
arrayList.Add(“B”);
arrayList.Add(“C”);
arrayList.Add(“D”);
arrayList.Add(“E”);

foreach (string item in arrayList)
{
Console.WriteLine(“Inhalt: ” + item);
}
[/csharp]

Ausgabe:

Inhalt: A
Inhalt: B
Inhalt: C
Inhalt: D
Inhalt: E

Kategorien C#

ArrayList in C#

Normale Arrays haben den Nachteil, dass die Indizierung statisch ist. In vielen Anwendungsfällen ist dies jedoch unpraktisch, da ein Array für keine Situation zu klein bemessen sein darf, ein zu großes Array belegt hingegen zu viel ungenutzten Speicherplatz im Arbeitsspeicher.

Eine ArrayList, welche eigentlich auch nur eine List<T> mit Index ist, schafft Abhilfe. Eine C# ArrayList ist ein dynamisches Array. Die Klasse ArrayList ist von einigen Klassen, u.A. der IList, abgeleitet. Für die Implementierung bedarf es der System.Collections.

→ WEITERLESEN

Kategorien C#

Arrays in C#

Arrays sind indizierter Mehrfach-Platzhalter gleichen Datentyps. Ein Array ,unter C-Programmierern oft auch Vektor genannt, hat einen deklarierten Namen wie eine Variable und dazu einen eckigen Klammerbereich []. Die Klammern dienen der Indizierung.

Arrays werden dann nützlich, wenn ein Wertetyp für einen definierten Zweck mehrfach benötigt wird. Stellen Sie sich vor, Sie müssten für jeden Tag den Fortschritt des Stromzählers speichern und nach 7 Tagen einen Durchschnitt aus den Tagesverbräuchen bilden.
Sicherlich ließen sich dafür 7 Variablen, z.B. zstand_montag, zstand_dienstag, zstand_mittwoch, zstand_donnerstag, zstand_freitag, zstand_samstag und zstand_sonntag, anlegen. Dies ist jedoch aufwändig, insbesondere, wenn Sie die verschiedene Berechnungen mit diesen Variablen durchführen müssen.

→ WEITERLESEN

Kategorien C#