День двести пятидесятый. #ЗаметкиНаПолях
Использование методов расширения в инициализаторах коллекций
Для использования инициализатора коллекции необходимы два условия:
- Тип должен реализовывать
- Должен быть подходящий метод
Варианты использования:
1. Создание сигнатур метода Add общего назначения. Например, инициализация коллекцией:
Использование методов расширения в инициализаторах коллекций
Для использования инициализатора коллекции необходимы два условия:
- Тип должен реализовывать
IEnumerable
. Это раздражающее ограничение. Иногда приходится реализовывать IEnumerable
исключительно для того, чтобы использовать тип в инициализаторах коллекций.- Должен быть подходящий метод
Add
для каждого элемента в инициализаторе коллекции. Предполагается, что любые элементы, которые не находятся в фигурных скобках, соответствуют вызовам метода Add
с одним аргументом. Когда требуется несколько аргументов, они должны быть в фигурных скобках. Например:List<string> strings = new List<string> { 10, "hello", { 20, 3 } };Эквивалентно:
List<string> strings = new List<string>();Далее для определения, что значит каждый вызов, применяется стандартное разрешение перегрузки методов. С обычным
strings.Add(10);
strings.Add("hello");
strings.Add(20, 3);
List<T>
этот код не скомпилируется. Но можно добавить метод расширения:public static void Add(Этот метод добавляет значение первого аргумента столько раз, сколько указано во втором аргументе. Таким образом список примет вид:
this List<string> list, int value, int count = 1)
{
list.AddRange(Enumerable.Repeat(value.ToString(), count));
}
"10", "hello", "20", "20", "20"
.Варианты использования:
1. Создание сигнатур метода Add общего назначения. Например, инициализация коллекцией:
public static void Add<T>(this List<T> list, IEnumerable<T> collection)Применение (контакты человека инициализируются коллекцией людей из Москвы):
{
list.AddRange(collection);
}
Person jon = new Person2. Создание специализированных сигнатур метода Add. Например, добавление в словарь объектов (людей) с ключом в виде одного из свойств (имя):
{
Name = "Jon",
Contacts = { allContacts.Where(c => c.Town == "Moscow") }
};
public static void Add(Применение:
this Dictionary<string, Person> dictionary, Person person)
{
dictionary.Add(person.Name, person);
}
var dictionary = new Dictionary<string, Person>Источник: Jon Skeet “C# In Depth”. 4th ed – Manning Publications Co, 2019. Глава 10.
{
{ new Person { Name = "Jon", … } },
{ new Person { Name = "Holly", … } }
};