Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem schrittbasierten Artikel erfahren Sie, wie Sie eine benutzerdefinierte Auflistung in Visual C# implementieren. Die Microsoft .NET Framework-Basisklassenbibliotheken bieten eine formale Definition einer Sammlungsschnittstelle System.Collections.ICollection .
Originalproduktversion: Visual C#
Ursprüngliche KB-Nummer: 307484
Implementieren der ICollection-Schnittstelle in einer benutzerdefinierten Klasse
Die ICollection -Schnittstelle erbt von der IEnumerable -Schnittstelle. Die ICollection Schnittstelle definiert eine CopyTo Methode und drei schreibgeschützte Eigenschaften: IsSynchronized, , SyncRootund Count. ICollection erbt die GetEnumerator Methode von der IEnumerable Schnittstelle. Eine benutzerdefinierte Sammlungsklasse sollte die ICollection Schnittstelle implementieren.
Führen Sie die folgenden Schritte aus, um die ICollection Schnittstelle zu implementieren:
Erstellen Sie in Visual C# .NET eine Windows-Anwendung.
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen, zeigen Sie auf "Hinzufügen", und klicken Sie dann auf "Klasse hinzufügen", um ein Klassenmodul namens CustomCollection hinzuzufügen.
Fügen Sie den folgenden Beispielcode am Anfang des Klassenmoduls hinzu, um den
System.CollectionNamespace zu importieren:using System.Collections;Ersetzen Sie einen anderen Code im Modul durch den folgenden Beispielcode:
public class CustomCollection : ICollection { private int[] intArr = {1,5,9}; private int Ct; public CustomCollection() { Ct=3; } }Der Einfachheit halber enthält die
CustomCollectionKlasse ein Array mit drei ganzzahligen Elementen und einer Anzahlvariable.Implementieren Sie die
CopyToMethode, die ein ganzzahliges Array und einen Index als Parameter verwendet. Diese Methode kopiert die Elemente in einer Auflistung in das Array ab dem übergebenen Index. Um diese Methode zu implementieren, fügen Sie den folgenden Code nach dem öffentlichenCustomCollectionKonstruktor ein:void ICollection.CopyTo(Array myArr, int index) { foreach (int i in intArr) { myArr.SetValue(i,index); index = index+1; } }Implementieren Sie die
GetEnumeratorMethode, die von derICollectionSchnittstelleIEnumerablegeerbt wird. DieGetEnumeratorMethode gibt einEnumeratorObjekt zurück, das eine Auflistung durchlaufen kann. Fügen Sie den folgenden Beispielcode nach derCopyToMethode ein:IEnumerator IEnumerable.GetEnumerator() { return new Enumerator(intArr); }Um die drei schreibgeschützten Eigenschaften zu implementieren, fügen Sie den folgenden Code nach der
GetEnumeratorMethode ein:// The IsSynchronized Boolean property returns True if the // collection is designed to be thread safe; otherwise, it returns False. bool ICollection.IsSynchronized { get { return false; } } // The SyncRoot property returns an object, which is used for synchronizing // the collection. This returns the instance of the object or returns the // SyncRoot of other collections if the collection contains other collections. object ICollection.SyncRoot { get { return this; } } // The Count read-only property returns the number // of items in the collection. int ICollection.Count { get { return Ct; } }
Implementieren eines Enumerator-Objekts für die GetEnumerator-Methode
In diesem Abschnitt wird gezeigt, wie Sie eine Enumerator Klasse erstellen, die durchlaufen CustomCollectionkann.
Fügen Sie den folgenden Beispielcode nach der Endklasse-Anweisung in Ihr Klassenmodul ein:
public class Enumerator : IEnumerator { private int[] intArr; private int Cursor; }Deklarieren Sie das
intArrprivate ganzzahlige Array, um die Elemente derCustomCollectionKlasse zu halten, wenn dieGetEnumeratorMethode aufgerufen wird. DasCursorFeldelement enthält die aktuelle Position beim Aufzählen.Fügen Sie einen Konstruktor
intArrals Parameter hinzu, und legen Sie den lokalenintArrWert auf diesen Fest. Fügen Sie den folgenden Beispielcode nach der Deklaration des Memberfelds ein:public Enumerator(int[] intarr) { this.intArr = intarr; Cursor = -1; }Implementieren Sie die Methoden
ResetundMoveNext. Fügen Sie dazu den folgenden Code nach dem Konstruktor ein:void IEnumerator.Reset() { Cursor = -1; } bool IEnumerator.MoveNext() { if (Cursor < intArr.Length) Cursor++; return(!(Cursor == intArr.Length)); }Resetlegt denCursorWert auf -1 fest undMoveNextverschiebt dasCursornächste Element.MoveNextgibt True zurück, wenn dies erfolgreich ist.Implementieren Sie die
Currentschreibgeschützte Eigenschaft, die das Element zurückgibt, das von derCursor. Wenn diesCursor-1 ist, wird einInvalidOperationException. Fügen Sie den folgenden Code nach derMoveNextMethode ein:object IEnumerator.Current { get { if((Cursor < 0) || (Cursor == intArr.Length)) throw new InvalidOperationException(); return intArr[Cursor]; } }
Verwenden der einzelnen Elemente zum Durchlaufen der benutzerdefinierten Sammlung
Ziehen Sie in Form1.cs auf der Registerkarte "Entwurf" eine Schaltfläche auf das Formular.
Doppelklicken Sie auf die Schaltfläche, und fügen Sie dem
ClickEreignis der Schaltfläche den folgenden Beispielcode hinzu:CustomCollection MyCol = new CustomCollection(); foreach (object MyObj in MyCol) MessageBox.Show(MyObj.ToString());Drücken Sie F5, um die Anwendung auszuführen, und klicken Sie dann auf die Schaltfläche.
Notiz
In einem Meldungsfeld werden die Elemente in der benutzerdefinierten Auflistung angezeigt.
Wie funktioniert das? Für jede Ruft die GetEnumerator Methode zum Erstellen des Enumerator Objekts auf und ruft die MoveNext Methode auf, um das Cursor erste Element festzulegen. Anschließend wird auf die aktuelle Eigenschaft zugegriffen, um das Element abzurufen.MyObj Dies wird wiederholt, bis MoveNext "False" zurückgegeben wird.