Intention
Um die Klasse List<T> vor Zugriffen zu schützen / zu beschränken oder diese mit Notification-Events (z.B. ObservableCollection) auszustatten werden für den jeweiligen Verwendungszweck eigene Collections verwendet.
Ansatz
Um eine eigene Collection zu erstellen, welche mit foreach( … ) über die Elemente der eingekapselten Struktur (also z.B. List<T>) zu iterieren, benötigt man eine Enumerator-Klasse, welche die Methoden …
- MoveNext()
- Reset()
- … und die Property „Current“ implementiert
implementiert (hier MyCollectionEnumerator) … sowie natürlich die gecustomizte Collection-Klasse selber, die die Datenstruktur enthält (hier MyCollection).
Lösung
using System;
using System.Collections.Generic;
namespace Irrsinn
{
// Diese Klasse definiert mit MoveNext / Reset und der Property
// Current aus dem Interface IEnumerator wie foreach(String s in col)
// über die eingekapselte Liste iterieren darf.
public class MyCollectionEnumerator : System.Collections.IEnumerator
{
private List<string> StringList;
private int Counter = -1;
// Im Konstruktor wird die Liste übergeben um die Operationen
// MoveNext / Reset / Current darauf ausführen zu können
public MyCollectionEnumerator(List<string> _StringList)
{
this.StringList = _StringList;
}
// Geht auf den nächsten Datensatz, der in der Liste
// gespeichert ist. Wenn MoveNext() false zurückgibt
// ist das Ende der Liste erreicht
public bool MoveNext()
{
Counter++;
return Counter < StringList.Count;
}
// Setzt die Collection zurück.
public void Reset()
{
Console.WriteLine("RESET!");
Counter = -1;
}
// Gibt immer das aktuelle Element zurück, was mit
// MoveNext erreicht wurde
public object Current
{
get
{
return StringList[Counter];
}
}
}
public class MyCollection
{
// Intern ist sind Collections meistens vom Typ List<T>
// aber die eigene Implementierung gibt uns die Möglichkeit
// den Zugriff auf die Liste anzupassen.
private List<string> _StringList = new List<string>();
// Hinzufügen eines Strings
public void AddString(string newString)
{
this._StringList.Add(newString);
}
// GetEnumerator wird benötigt um mit foreach(...)
// über die Collection zu iterieren
public System.Collections.IEnumerator GetEnumerator()
{
return new MyCollectionEnumerator(_StringList);
}
}
class Program
{
static void Main(string[] args)
{
// Gecustomizte Collection
MyCollection myCol = new MyCollection();
myCol.AddString("Schatzi schenk mir ein Foto");
myCol.AddString("schenk mir ein Foto vom Bier");
myCol.AddString("Schatzi schenk mir ein Foto");
myCol.AddString("Dann schenk ich Dir auch eins");
myCol.AddString("vom Tier (also von den Muppets)");
foreach (string s in myCol)
{
Console.WriteLine(s);
}
Console.ReadLine();
}
}
}