Esto forma parte de la sintaxis del inicializador de recopilación en .NET. Puede utilizar esta sintaxis en cualquier colección se crea siempre que:
Lo que pasa es que el se llama al constructor predeterminado y se llama a Add(...)
para cada miembro del inicializador.
Por lo tanto, estos dos bloques son más o menos idénticos:
List<int> a = new List<int> { 1, 2, 3 };
Y
List<int> temp = new List<int>();
temp.Add(1);
temp.Add(2);
temp.Add(3);
List<int> a = temp;
Usted puede llamada de una constructora alternativo si lo desea, por ejemplo, para evitar el exceso de dimensionar el List<T>
durante creciente, etc .:
// Notice, calls the List constructor that takes an int arg
// for initial capacity, then Add()'s three items.
List<int> a = new List<int>(3) { 1, 2, 3, }
Tenga en cuenta que el método Add()
no necesita tomar un solo elemento, por ejemplo el método Add()
para Dictionary<TKey, TValue>
toma dos artículos:
var grades = new Dictionary<string, int>
{
{ "Suzy", 100 },
{ "David", 98 },
{ "Karen", 73 }
};
es aproximadamente igual a:
var temp = new Dictionary<string, int>();
temp.Add("Suzy", 100);
temp.Add("David", 98);
temp.Add("Karen", 73);
var grades = temp;
lo tanto, para agregar esto a su propia clase, todo lo que necesita hacer, como se ha mencionado, es aplicar IEnumerable
(de nuevo, preferentemente IEnumerable<T>
) y crear uno o más métodos: Add()
public class SomeCollection<T> : IEnumerable<T>
{
// implement Add() methods appropriate for your collection
public void Add(T item)
{
// your add logic
}
// implement your enumerators for IEnumerable<T> (and IEnumerable)
public IEnumerator<T> GetEnumerator()
{
// your implementation
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
A continuación, puede usarlo al igual que las colecciones de BCL hacen:
public class MyProgram
{
private SomeCollection<int> _myCollection = new SomeCollection<int> { 13, 5, 7 };
// ...
}
(Para más información, ver la MSDN)
Esta pregunta puede ser de ayuda: http://stackoverflow.com/questions/1744967/in-c-is-there-a-way-to-write-custom-object-initializers-for-new-data- tipos –
Bastante impresionante ¿eh? También puede hacer un código similar para inicializar diccionarios: '{{" key1 "," value1 "}, {" key2 "," value2 "}}' – danludwig
Desde otra perspectiva, esta matriz como la sintaxis de inicialización nos da un recordatorio de que subyace tipo de datos de una 'Lista' es en realidad una matriz solamente. Odio el equipo C# por el hecho de que no lo llaman 'ArrayList ' que suena tan obvio y natural. –
RBT