Generalmente estoy en el campo de simplemente usar una lista directamente, a menos que por alguna razón necesite encapsular la estructura de datos y proporcionar un subconjunto limitado de su funcionalidad. Esto es principalmente porque si no tengo una necesidad específica de encapsulación, hacerlo es solo una pérdida de tiempo.
Sin embargo, con la característica de inicialización agregada en C# 3.0, hay algunas situaciones nuevas en las que recomendaría usar clases de colección personalizadas.
Básicamente, C# 3.0 permite cualquier clase que implemente IEnumerable
y tiene un método Add para usar la nueva sintaxis del inicializador agregado. Por ejemplo, debido diccionario define un método Add (clave K, el valor V) es posible inicializar un diccionario con esta sintaxis:
var d = new Dictionary<string, int>
{
{"hello", 0},
{"the answer to life the universe and everything is:", 42}
};
La gran cosa acerca de la característica es que funciona con los métodos add con cualquier número de argumentos. Por ejemplo, dada esta colección:
class c1 : IEnumerable
{
void Add(int x1, int x2, int x3)
{
//...
}
//...
}
sería posible inicializar que de este modo:
var x = new c1
{
{1,2,3},
{4,5,6}
}
Esto puede ser muy útil si se necesita para crear tablas estáticas de objetos complejos. Por ejemplo, si se acaba utilizando List<Customer>
y desea crear una lista estática de los objetos del cliente tendría que crearlo, así:
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")
}
Sin embargo, si se utiliza una colección personalizada, como éste:
class CustomerList : List<Customer>
{
public void Add(string name, string phoneNumber, string city, string stateOrCountry)
{
Add(new Customer(name, phoneNumber, city, stateOrCounter));
}
}
a continuación, puede inicializar la colección con esta sintaxis:
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"}
}
esto tiene la ventaja de ser más fácil de escribir y de leer sea más fácil porque no es necesario volver a escribir el nombre del tipo de elemento para cada elemento. La ventaja puede ser particularmente fuerte si el tipo de elemento es largo o complejo.
Dicho esto, esto solo es útil si necesita colecciones estáticas de datos definidos en su aplicación. Algunos tipos de aplicaciones, como los compiladores, los usan todo el tiempo. Otros, como las aplicaciones de bases de datos típicas, no lo hacen porque cargan todos sus datos desde una base de datos.
Mi consejo sería que si necesita definir una colección estática de objetos o si necesita encapsular la interfaz de colección, cree una clase de colección personalizada.De lo contrario, simplemente usaría List<T>
directamente.
Puede hacer LoadAll() como un método de extensión que cuelga de la lista. Eso le daría LoadAll() en cada Lista/Colección y podría leer desde cualquier IEnumerable ... algunas personas podrían decir que esto es un abuso de los métodos de extensión. Pero digo que te permite actuar como si tuvieras herencia múltiple. –
Buena idea, aunque mi método LoadAll() no es realmente genérico. Se carga desde diferentes tablas dependiendo del tipo de objeto subyacente. Puede haber una manera de hacerlo genéricamente, pero realmente no he investigado eso hasta ahora. – jeremcc