Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort zur 6. Auflage
1 Allgemeine Einführung in .NET
2 Grundlagen der Sprache C#
3 Das Klassendesign
4 Vererbung, Polymorphie und Interfaces
5 Delegates und Ereignisse
6 Strukturen und Enumerationen
7 Fehlerbehandlung und Debugging
8 Auflistungsklassen (Collections)
9 Generics – Generische Datentypen
10 Weitere C#-Sprachfeatures
11 LINQ
12 Arbeiten mit Dateien und Streams
13 Binäre Serialisierung
14 XML
15 Multithreading und die Task Parallel Library (TPL)
16 Einige wichtige .NET-Klassen
17 Projektmanagement und Visual Studio 2012
18 Einführung in die WPF und XAML
19 WPF-Layout-Container
20 Fenster in der WPF
21 WPF-Steuerelemente
22 Elementbindungen
23 Konzepte von WPF
24 Datenbindung
25 Weitere Möglichkeiten der Datenbindung
26 Dependency Properties
27 Ereignisse in der WPF
28 WPF-Commands
29 Benutzerdefinierte Controls
30 2D-Grafik
31 ADO.NET – Verbindungsorientierte Objekte
32 ADO.NET – Das Command-Objekt
33 ADO.NET – Der SqlDataAdapter
34 ADO.NET – Daten im lokalen Speicher
35 ADO.NET – Aktualisieren der Datenbank
36 Stark typisierte DataSets
37 Einführung in das ADO.NET Entity Framework
38 Datenabfragen des Entity Data Models (EDM)
39 Entitätsaktualisierung und Zustandsverwaltung
40 Konflikte behandeln
41 Plain Old CLR Objects (POCOs)
Stichwort

Download:
- Beispiele, ca. 62,4 MB

Buch bestellen
Ihre Meinung?

Spacer
Visual C# 2012 von Andreas Kühnel
Das umfassende Handbuch
Buch: Visual C# 2012

Visual C# 2012
Rheinwerk Computing
1402 S., 6., aktualisierte und erweiterte Auflage 2013, geb., mit DVD
49,90 Euro, ISBN 978-3-8362-1997-6
Pfeil 8 Auflistungsklassen (Collections)
Pfeil 8.1 Grundlagen
Pfeil 8.2 Collections im Namespace »System.Collections«
Pfeil 8.2.1 Die elementaren Schnittstellen der Auflistungsklassen
Pfeil 8.3 Die Klasse »ArrayList«
Pfeil 8.3.1 Einträge hinzufügen
Pfeil 8.3.2 Datenaustausch zwischen einem Array und einer »ArrayList«
Pfeil 8.3.3 Die Elemente einer »ArrayList« sortieren
Pfeil 8.3.4 Sortieren von Arrays mit »ArrayList.Adapter«
Pfeil 8.4 Die Klasse »Hashtable«
Pfeil 8.4.1 Methoden und Eigenschaften der Schnittstelle »IDictionary«
Pfeil 8.4.2 Beispielprogramm zur Klasse »Hashtable«
Pfeil 8.5 Die Klassen »Queue« und »Stack«
Pfeil 8.5.1 Die Klasse »Stack«
Pfeil 8.5.2 Die Klasse »Queue«
Pfeil 8.6 Eigene Auflistungen mit »yield« durchlaufen

Galileo Computing - Zum Seitenanfang

8.6 Eigene Auflistungen mit »yield« durchlaufenZur nächsten Überschrift

Nehmen wir an, wir hätten eine Klassendefinition wie folgt:

public class Months {
string[] months = { "Januar", "Februar", "März", "April",
"Mai", "Juni", "Juli", "August",
"September", "Oktober", "November", "Dezember"
};
}

Listing 8.22 Definition der Klasse »Months«

Wäre es nicht schön, mit einer foreach-Schleife den Datenspeicher des Objekts months zu durchlaufen und Zugriff auf alle Elemente zu erhalten, etwa wie folgt:

Months monate = new Months();
foreach(string temp in monate) {
Console.WriteLine(temp);
}

Listing 8.23 Ein »Months«-Objekt in einer foreach-Schleife durchlaufen

Dass daran Bedingungen geknüpft sind, wurde weiter oben schon erwähnt. Die Klasse Months muss dazu die Schnittstelle IEnumerable implementieren.

public class Months : IEnumerable

Die einzige in IEnumerable definierte Methode GetEnumerator liefert ein Objekt, das wiederum die Schnittstelle IEnumerator unterstützt.

IEnumerator GetEnumerator();

Das von der Methode GetEnumerator zurückgelieferte IEnumerator-Objekt muss die Methoden MoveNext und Reset sowie die Eigenschaft Current implementieren, damit das Durchlaufen des Objekts mit foreach möglich wird.

MoveNext positioniert den Enumerator nach dem ersten Aufruf vor das erste Element der Auflistung und setzt den Positionszeiger mit jedem Aufruf auf das nächste Element in der Liste. Gleichzeitig wird ein boolescher Wert zurückgeliefert, der true ist, wenn der Enumerator auf ein Element gesetzt werden konnte, und false, falls der Enumerator das Ende der Liste überschritten hat. Die Methode Reset setzt den Positionszeiger auf die Position vor dem ersten Element der Liste, und Current ruft das aktuelle Element ab.

Die Beschreibung macht deutlich, dass einiges an Tippaufwand erforderlich ist, um aus einer Klasse wie Months eine Liste zu machen, die in einer foreach-Schleife durchlaufen werden kann.

Durch den Einsatz des Schlüsselwortes yield geht es aber auch einfacher. Sie müssen zwar immer noch die Schnittstelle IEnumerable und damit auch die Methode GetEnumerator implementieren, benötigen aber keinen IEnumerator-Typ mehr. Stattdessen liefern Sie die Daten nur noch mit dem neuen Schlüsselwort yield, gefolgt von return, aus.

// Beispiel: ..\Kapitel 8\YieldSample

class Program {

static void Main(string[] args) {
Months months = new Months();
foreach(string temp in months)
Console.WriteLine(temp);
Console.ReadLine();
}
}

public class Months : IEnumerable
{
string[] month = { "Januar", "Februar", "März", "April",
"Mai", "Juni", "Juli", "August", "September",
"Oktober", "November", "Dezember"
};

// Methode der Schnittstelle IEnumerable

public IEnumerator GetEnumerator() {
for (int i = 0; i < month.Length; i++)
yield return month[i];
}
}

Listing 8.24 Klasse, die in einer foreach-Schleife durchlaufen werden kann

yield in Kombination mit return wird zur Angabe des zurückgegebenen Wertes verwendet. Bei Erreichen von yield return wird die aktuelle Position gespeichert, und beim nächsten Aufruf der Schleife wird die Ausführung von dieser Position neu gestartet. Mehr haben Sie nicht zu tun, denn im Hintergrund generiert der Compiler automatisch die Methoden Current und MoveNext der IEnumerator-Schnittstelle, wenn er yield erkennt.

Sie können das Programm sogar noch einfacher schreiben und auf die Implementierung von IEnumerable verzichten. Überlassen Sie einfach alles dem Compiler und yield return. Dazu schreiben Sie ebenfalls eine Methode, deren spezielle Aufgabe es ist, die Objektmenge zurückzuliefern. Die Methode dürfen Sie beliebig benennen. Der Rückgabewert ist ein Objekt, das die Schnittstelle IEnumerable implementiert – und somit auch implizit die Methode GetEnumerator. Hinter den Kulissen wird der Compiler dafür sorgen, dass der Iterator der anfragenden foreach-Schleife alle Daten der Reihe nach übergibt.

Das folgende Listing zeigt, wie einfach jetzt der Code ist. Beachten Sie bitte auch, dass in der foreach-Schleife nun die Methode GetList für die Bereitstellung der Objekte sorgt.

class Program {

static void Main(string[] args) {
Months months = new Months();
foreach(string temp in months.GetList())
Console.WriteLine(temp);
Console.ReadLine();
}
}

public class Months
{
string[] month = { [...] };

public IEnumerable GetList() {
for (int i = 0; i < month.Length; i++)
yield return month[i];
}
}

Listing 8.25 Klasse ohne das Interface »IEnumerable«

Einschränkungen von »yield return«

Der Einsatz von yield return unterliegt zwei Einschränkungen:

  • yield return kann nicht innerhalb einer anonymen Methode codiert werden.
  • yield return darf weder in einem catch-Block noch in einem try-Block verwendet werden, wenn Letzterer eine catch-Klausel hat. Die Verwendung in einem try-Block, dem sich nur noch ein finally-Block anschließt, ist jedoch möglich.

Weitere Möglichkeiten

yield return ist für den Compiler der Anstoß, automatisch einen Iterator zu erzeugen, der von einer foreach-Schleife genutzt werden kann. Sie können auch mehrfach hintereinander yield aufrufen, wie das folgende Codefragment zeigt:

// Methode der Schnittstelle IEnumerable

public IEnumerator GetEnumerator() {
yield return "Januar";
yield return "Februar";
yield return "März";
}

Listing 8.26 Mehrere Aufrufe von »yield«

Es werden der Reihe nach die drei Monate ausgegeben.

In einem Iterator-Block ist das Statement return nicht zulässig. Zum Abbruch einer Iteration kombinieren Sie stattdessen yield mit break:

yield break;


Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.

>> Zum Feedback-Formular
<< zurück
  Zum Katalog
Zum Katalog: Visual C# 2012

Visual C# 2012
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Professionell entwickeln mit Visual C# 2012






 Professionell
 entwickeln mit
 Visual C# 2012


Zum Katalog: Windows Presentation Foundation






 Windows Presentation
 Foundation


Zum Katalog: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Katalog: C++ Handbuch






 C++ Handbuch


Zum Katalog: C/C++






 C/C++


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Rheinwerk Verlag GmbH 2013
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de