Это часть синтаксиса инициализатора коллекции в .NET. Вы можете использовать этот синтаксис в любой коллекции создается до тех пор, как:
Что происходит это вызывается конструктор по умолчанию, а затем для каждого элемента инициализатора вызывается Add(...)
.
Таким образом, эти два блока примерно одинаков:
List<int> a = new List<int> { 1, 2, 3 };
И
List<int> temp = new List<int>();
temp.Add(1);
temp.Add(2);
temp.Add(3);
List<int> a = temp;
Вы может вызова альтернативного конструктор если вы хотите, например, для предотвращения чрезмерного размера в List<T>
во время выращивание и т. д .:
// 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, }
Обратите внимание, что метод Add()
не нужно взять один элемент, например, метод Add()
для Dictionary<TKey, TValue>
занимает две позиции:
var grades = new Dictionary<string, int>
{
{ "Suzy", 100 },
{ "David", 98 },
{ "Karen", 73 }
};
грубо идентичны:
var temp = new Dictionary<string, int>();
temp.Add("Suzy", 100);
temp.Add("David", 98);
temp.Add("Karen", 73);
var grades = temp;
Таким образом, чтобы добавить это к вашему собственный класс, все, что вам нужно сделать, как уже упоминалось, это реализовать IEnumerable
(опять же, предпочтительно IEnumerable<T>
) и создать один или несколько 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();
}
}
Затем вы можете использовать его так же, как в BCL коллекции сделать:
public class MyProgram
{
private SomeCollection<int> _myCollection = new SomeCollection<int> { 13, 5, 7 };
// ...
}
(Для получения дополнительной информации см MSDN)
Этот вопрос может быть полезным: http://stackoverflow.com/questions/1744967/in-c-is-there-a-way-to-write-custom-object-initializers-for-new-data- типы –
Pretty awesome huh? Вы можете сделать очень похожий код для инициализации словарей: '{{" key1 "," value1 "}, {" key2 "," value2 "}}' – danludwig
С другого представления этот массив, такой как синтаксис инициализации, дает нам напоминание о том, что базовые тип данных «Список' на самом деле является массивом. Я ненавижу команду C# за то, что они не называют ее «ArrayList », которая звучит так очевидно и естественно. –
RBT