Sammlungen sind ein wichtiges Konzept in OOP und die umfassende Unterstützung für Sammlungen in C# ist eine der Essenzen der Sprache.
Warum generische Sammlungen verwenden?
Vor C# 2.0 gab es zwei Hauptmöglichkeiten, Sammlungen zu implementieren:
a. Verwenden Sie ArrayList
, um Objekte direkt in ArrayList einzufügen Die Elemente sind vom Typ Object, daher müssen bei jeder Verwendung langwierige Typkonvertierungen durchgeführt werden.
b. Verwenden Sie eine benutzerdefinierte Sammlungsklasse
Ein gängiger Ansatz besteht darin, eine benutzerdefinierte Klasse von der abstrakten CollectionBase-Klasse zu erben und eine stark typisierte Sammlung durch Kapselung des IList-Objekts zu implementieren. Diese Methode erfordert das Schreiben einer entsprechenden benutzerdefinierten Klasse für jeden Sammlungstyp, was einen hohen Arbeitsaufwand erfordert. Das Aufkommen generischer Sammlungen hat die oben genannten Probleme besser gelöst. Es ist nur eine Codezeile erforderlich, um eine Sammlung eines bestimmten Typs zu erstellen.
Was sind Generika?
Generics sind ein neues Element in C# 2.0 (in C++ Templates genannt), das hauptsächlich zur Lösung einer Reihe ähnlicher Probleme verwendet wird. Dieser Mechanismus ermöglicht die Übergabe eines Klassennamens als Parameter an einen generischen Typ und die Erzeugung des entsprechenden Objekts. Es ist möglicherweise besser, sich Generika (einschließlich Klassen, Schnittstellen, Methoden, Delegaten usw.) als Vorlagen vorzustellen. Der Variantenteil in der Vorlage wird durch den als Parameter übergebenen Klassennamen ersetzt, wodurch eine neue Typdefinition erhalten wird. Generika sind ein relativ umfangreiches Thema und werden hier nicht im Detail analysiert. Interessierte können entsprechende Informationen einsehen.
Wie erstelle ich eine generische Sammlung?
Verwendet hauptsächlich die generische Klasse List
Definieren Sie die Klasse Person wie folgt:
Wie Sie sehen, vereinfachen generische Sammlungen den Implementierungscode von Sammlungen erheblich, wodurch problemlos Sammlungen bestimmter Typen erstellt werden können. Darüber hinaus bieten generische Sammlungen auch leistungsfähigere Funktionen. Werfen wir einen Blick auf das Sortieren und Suchen.
List
Das „T“ ist der zu verwendende Typ, der ein einfacher Typ sein kann, wie z. B. string, int, oder Es handelt sich um einen benutzerdefinierten Typ. Schauen wir uns unten ein konkretes Beispiel an.
class Person
{
private string _name; //Name
private int _age;
//Personenobjekt erstellen
öffentliche Person(string Name, int Age)
{
this._name= Name;
this._age = Age;
}
//Name
public string Name
{
get { return _name; }
}
//Alter
public int Age
{
get { return _age; }
}
}
//Personenobjekt erstellen
Person p1 = neue Person("Zhang San", 30);
Person p2 = neu Person("李思", 20);
Person p3 = new Person("王五", 50);
//Eine Sammlung von Objekten vom Typ Person erstellen
List
//Füge das Person-Objekt in die Sammlung ein
persons.Add(p1);
personen. Add(p2);
persons.Add(p3);
//Gib den Namen der zweiten Person aus
Console.Write(persons[1]. Name);
Sortieren von generischen Sammlungen
Die Sortierung basiert auf dem Vergleich. Es gibt beispielsweise zwei Zahlen, 1 und 2. Um sie zu sortieren, müssen Sie zunächst die beiden Zahlen vergleichen und anhand der Vergleichsergebnisse sortieren. Wenn Sie Objekte vergleichen möchten, ist die Situation etwas komplizierter. Beim Vergleich von Personenobjekten können Sie beispielsweise nach Namen oder Alter vergleichen, was die Festlegung der Vergleichsregeln erfordert. Ein Objekt kann über mehrere Vergleichsregeln verfügen, es kann jedoch nur eine Standardregel geben, die in der Klasse platziert wird, die das Objekt definiert. Die Standardvergleichsregeln werden in der CompareTo-Methode definiert, die zur generischen Schnittstelle IComparable
class Person: IComparable
{
//Vergleiche nach Alter
public int CompareTo(Person p )
{
return this.Age - p.Age;
}
}
Der Parameter der CompareTo-Methode ist Zum Vergleich mit einem anderen Objekt desselben Typs ist der Rückgabewert vom Typ int. Wenn der Rückgabewert größer als 0 ist, bedeutet dies, dass das erste Objekt größer als das zweite Objekt ist Dies bedeutet, dass das erste Objekt kleiner als das zweite Objekt ist. Wenn die Rückgabe 0 ist, sind die beiden Objekte gleich.
Nachdem Sie die Standardvergleichsregeln definiert haben, können Sie die Sammlung über die Sortiermethode ohne Parameter sortieren, wie unten gezeigt:
//Sortieren Sie die Sammlung gemäß den Standardregeln
persons.Sort();
//Geben Sie den Namen des Besitzers aus
foreach (Person p in personen)
{
Console.WriteLine(p.Name); //Die Ausgabe Reihenfolge ist „Li Si“, „Zhang San“, „Wang Wu“
}
Im tatsächlichen Gebrauch ist es oft notwendig, Sätze nach vielen verschiedenen Regeln zu sortieren, was die Definition anderer erfordert Vergleichsregeln. Sie können in der Compare-Methode definiert werden, die zur generischen Schnittstelle IComparer
Klasse NameComparer: IComparer
//Storage-Sorter-Instanz
public static NameComparer Default = new NameComparer();
//Nach Namen vergleichen
public int Compare(Person p1, Person p2)
{
return System.Collections.Comparer.Default.Compare(p1.Name, p2.Name);
}
}
Die Parameter der Compare-Methode sind zwei zu vergleichende Objekte desselben Typs, der Rückgabewert ist vom Typ int und die Verarbeitungsregeln für den Rückgabewert sind dieselben wie bei der CompareTo-Methode. Comparer.Default gibt unter anderem ein integriertes Comparer-Objekt zum Vergleichen zweier Objekte desselben Typs zurück.
Als nächstes verwenden Sie den neu definierten Komparator, um die Sammlung zu sortieren:
Sie können die Sammlung auch durch Delegation sortieren. Zuerst müssen Sie eine Methode für die Delegation definieren, um Vergleichsregeln aufzurufen. Sie können statische Methoden verwenden. Bitte schauen Sie sich den folgenden Code an: Sortieren Sie dann die Sammlung über den integrierten generischen Delegaten System.Comparison
Sie können sehen, dass die beiden letztgenannten Methoden die Sammlung nach den angegebenen Regeln sortieren können, aber Der Autor Wenn Sie lieber die Delegationsmethode verwenden möchten, können Sie verschiedene Vergleichsregeln in einer Klasse unterbringen und diese dann flexibel aufrufen.
//Sammlung nach Namen sortieren
persons.Sort(NameComparer.Default);
//Alle Namen ausgeben
foreach (Person p in Personen)
{
Console.WriteLine(p.Name); //Die Ausgabereihenfolge ist „李思“, „王五“, „张三“
}class PersonComparison
{
//Vergleich nach Name
public static int Name(Person p1, Person p2)
{
Return system.Collections.comparer.Default.compare (p1.name, p2.name);}
}>
Die Parameter der Methode müssen zwei Objekte von verglichen werden vom gleichen Typ, der Rückgabewert ist vom Typ int und die Verarbeitungsregeln für den Rückgabewert sind dieselben wie bei der CompareTo-Methode.
System.Comparison
persons.Sort(NameComparison);
//Alle ausgeben Personenname
foreach (Person p in personen)
{
Console.WriteLine(p.Name); //Die Ausgabereihenfolge ist „李思“, „王五" ","Zhang San"
}
Wie Sie sehen, können die beiden letztgenannten Methoden die Sammlung nach den angegebenen Regeln sortieren, der Autor bevorzugt jedoch die Delegationsmethode. Sie können erwägen, die einzelnen Vergleichsregeln in einer Klasse zu platzieren und sie dann flexibel aufzurufen.
Suche nach generischen Sammlungen
Bei der Suche geht es darum, Elemente aus der Sammlung zu finden, die bestimmte Bedingungen erfüllen. Es können mehrere Suchbedingungen definiert und nach Bedarf aufgerufen werden. Definieren Sie zunächst die Suchbedingungen wie folgt:
Klasse PersonPredicate
{
//Personen mittleren Alters (über 40 Jahre) finden
öffentlich static bool MidAge(Person p)
{
if (p.Age >= 40)
return true;
else
return false; Item gibt true zurück, andernfalls gibt es false zurück.
System.Predicate
List
//Alle Namen von Personen mittleren Alters ausgeben
foreach (Person p in MidAgePersons)
{
Console.WriteLine(p.Name); Ausgabe „Wang Wu“
} durchsucht dann die Sammlung über den integrierten generischen Delegaten System.Predicate
Erweiterung der generischen Sammlung
Was sollten Sie tun, wenn Sie die Namen aller Personen in der Sammlung durch Kommas getrennt erhalten möchten?
Da die Funktionen, die eine einzelne Klasse bereitstellen kann, begrenzt sind, ist es naheliegend, über eine Erweiterung der List
//Definieren Sie die Personensammlungsklasse
Klasse Personen: Liste
{
//Alle abrufen die Elemente in der Sammlung Name der Person
public string GetAllNames()
{
if (this.Count == 0)
return "";
String value = „“; 🎜>
} return val.Substring(0, val.Length - 1); >Persons PersonCol = new Persons();
PersonCol.Add(p1) ;
PersonCol.Add(p2);
PersonCol.Add(p3) ;
//Jeden Namen ausgeben
Console.Write(PersonCol. GetAllNames()); //Ausgabe „Zhang San, Li Si, Wang Wu“
Methoden und Attribute auflisten Methode oder Attributfunktion
Kapazität wird verwendet, um die Anzahl der Elemente abzurufen oder festzulegen die Liste kann Platz bieten. Dieser Wert erhöht sich automatisch, wenn die Menge die Kapazität überschreitet. Sie können diesen Wert festlegen, um die Kapazität zu reduzieren, oder die Methode trin() aufrufen, um die Kapazität so zu reduzieren, dass sie der tatsächlichen Anzahl von Elementen entspricht.
Count-Eigenschaft, wird verwendet, um die aktuelle Anzahl der Elemente im Array abzurufen.
Item() Ruft das Element durch Angabe des Index ab oder legt es fest. Für die List-Klasse handelt es sich um einen Indexer.
Öffentliche Methode Add() zum Hinzufügen eines Objekts zur Liste
Öffentliche Methode AddRange() zum Hinzufügen mehrerer Elemente, die die ICollection-Schnittstelle am Ende der Liste implementieren
BinarySearch( ) Überladene öffentliche Methode, die verwendet wird, um die binäre Suche zu verwenden, um das angegebene Element in der sortierten Liste zu finden
Clear( ) Alle Elemente in der Liste entfernen
Contains( ) Ein Element testen Ob es ist in der Liste
CopyTo() Überladene öffentliche Methode, kopiert eine Liste in ein eindimensionales Array
Exists() Testet, ob ein Element in der Liste ist
Find() Sucht das erste übereinstimmende Element in der Liste und gibt es zurück
FindAll() Sucht alle übereinstimmenden Elemente in der Liste und gibt es zurück
GetEnumerator() Überladene öffentliche Methode, gibt einen Enumerator zum Iterieren der Liste zurück
Getrange() Kopiert den angegebenen Bereich von Elementen in eine neue Liste
IndexOf() Überladene öffentliche Methode, um jedes passende Element zu finden und zurückzugeben. Index
Insert() Fügt ein ein Element in die Liste einfügen
InsertRange() Fügt eine Gruppe von Elementen in die Liste ein
LastIndexOf() Überladene öffentliche Methode, Suche Und gibt den Index des letzten übereinstimmenden Elements zurück
Remove( ) entfernt das erste Element, das mit dem angegebenen Element übereinstimmt
RemoveAt( ) entfernt das Element mit dem angegebenen Index
RemoveRange ( ) Entfernt die Elemente im angegebenen Bereich
Reverse ( ) Kehren Sie die Reihenfolge der Elemente in der Liste um
Sort( ) Sortieren Sie die Elemente in der Liste
ToArray( ) Kopieren Sie die Elemente in der Liste in ein neues Array
trimToSize( ) Setzt die Kapazität auf die tatsächliche Anzahl der Elemente in der Liste
Zusammenfassung:
Dieser Artikel konzentriert sich auf die Einführung in die Verwendung von C# Generics in 2.0 werden zum Implementieren von Sammlungen und zum Erweitern von Sammlungen verwendet Durch die ordnungsgemäße Verwendung generischer Sammlungen kann eine Menge sich wiederholender Arbeit reduziert und die Entwicklungseffizienz erheblich verbessert werden. Tatsächlich sind Sammlungen nur eine typische Anwendung von Generika. Wenn Sie mehr über Generika erfahren möchten, können Sie sich andere verwandte Informationen ansehen. Ich hoffe, dieser Artikel ist für Sie nützlich
Weitere Artikel zur Verwendung der C#-Liste finden Sie im PHP-Chinesisch Webseite!