Ich bin im Allgemeinen im Lager nur eine Liste direkt verwenden, es sei denn, aus irgendeinem Grunde Ich brauche die Datenstruktur zu verkapseln und eine begrenzte Teilmenge der Funktionalität. Dies liegt vor allem daran, dass es keine Zeitverschwendung ist, wenn ich kein spezifisches Bedürfnis nach Verkapselung habe.
Doch mit dem Aggregat initialisiert Funktion in C# 3.0, gibt es einige neue Situationen, in denen ich befürworten würde Ihre eigene Sammlung Klassen.
Grundsätzlich ermöglicht C# 3.0 jede Klasse, die IEnumerable
implementiert und über eine Add-Methode verfügt, um die neue Aggregatinitialisierungssyntax zu verwenden. Zum Beispiel, weil Wörterbuch eine Methode Add (K-Taste, V-Wert) definiert ist es möglich, ein Wörterbuch mit folgenden Syntax zu initialisieren:
var d = new Dictionary<string, int>
{
{"hello", 0},
{"the answer to life the universe and everything is:", 42}
};
Die große Sache über das Merkmal ist, dass es für Add-Methoden mit einem beliebigen Anzahl funktioniert von Argumenten. Zum Beispiel dieser Sammlung gegeben:
class c1 : IEnumerable
{
void Add(int x1, int x2, int x3)
{
//...
}
//...
}
es möglich wäre, es zu initialisieren, etwa so:
var x = new c1
{
{1,2,3},
{4,5,6}
}
Dies kann sehr nützlich sein, wenn Sie statische Tabellen komplexer Objekte erstellen müssen. wenn Sie nur Zum Beispiel wurden List<Customer>
verwenden und Sie wollten eine statische Liste von Kundenobjekten erstellen würden Sie es wie so erstellen müssen:
var x = new List<Customer>
{
new Customer("Scott Wisniewski", "555-555-5555", "Seattle", "WA"),
new Customer("John Doe", "555-555-1234", "Los Angeles", "CA"),
new Customer("Michael Scott", "555-555-8769", "Scranton PA"),
new Customer("Ali G", "", "Staines", "UK")
}
Wenn Sie jedoch eine individuelle Sammlung verwenden, wie diese:
class CustomerList : List<Customer>
{
public void Add(string name, string phoneNumber, string city, string stateOrCountry)
{
Add(new Customer(name, phoneNumber, city, stateOrCounter));
}
}
Sie könnten dann initialisieren die Sammlung mit folgenden Syntax:
var customers = new CustomerList
{
{"Scott Wisniewski", "555-555-5555", "Seattle", "WA"},
{"John Doe", "555-555-1234", "Los Angeles", "CA"},
{"Michael Scott", "555-555-8769", "Scranton PA"},
{"Ali G", "", "Staines", "UK"}
}
Dies hat den Vorteil, die beide leichter zu schreiben und leichter zu lesen weil sie den Elementtypnamen für jedes Element nicht erneut eingeben müssen. Der Vorteil kann besonders stark sein, wenn der Elementtyp lang oder komplex ist.
Davon abgesehen, ist dies nur dann sinnvoll, wenn Sie statische Sammlungen von Daten definiert in Ihrer Anwendung benötigen. Einige Arten von Apps, wie Compiler, verwenden sie ständig. Andere, wie typische Datenbank-Apps, tun dies nicht, weil sie alle ihre Daten aus einer Datenbank laden.
Mein Rat wäre, dass, wenn Sie entweder eine statische Sammlung von Objekten definieren, oder müssen die Sammlung Schnittstelle verkapseln weg, dann eine benutzerdefinierte Auflistungsklasse erstellen.Ansonsten würde ich einfach List<T>
direkt verwenden.
Sie könnten LoadAll() als eine Erweiterungsmethode ausführen, die von der Liste hängt. Das würde LoadAll() auf jeder Liste/Sammlung geben und es könnte von jedem IEnumerable lesen ... einige Leute könnten sagen, dass dies ein Missbrauch von Erweiterungsmethoden ist. Aber ich sage, es erlaubt Ihnen, so zu handeln, als ob Sie mehrfache Vererbung haben. –
Gute Idee, obwohl meine LoadAll() Methode nicht wirklich generisch ist. Es wird abhängig vom zugrunde liegenden Objekttyp aus verschiedenen Tabellen geladen. Es mag einen Weg geben, es generisch zu machen, aber ich habe mich bisher nicht wirklich damit befasst. – jeremcc