Упрощенная инициализация коллекции

#c# #collections #initialization

#c# #Коллекции #инициализация

Вопрос:

При инициализации действий WF4 мы можем сделать что-то вроде этого:

 Sequence s = new Sequence()
{
    Activities = {
        new If() ...,
        new WriteLine() ...,
    }
}
  

Обратите внимание, что Sequence.Activities это Collection<Activity> , но его можно инициализировать без новой коллекции().

Как я могу эмулировать это поведение в своих Collection<T> свойствах?

Ответ №1:

Любая коллекция, которая имеет Add() метод и реализует IEnumerable , может быть инициализирована таким образом. Для получения подробной информации обратитесь к инициализаторам объектов и коллекций для C #. (Отсутствие вызова new Collection<T> связано с инициализатором объекта, а возможность добавлять элементы в строку — с инициализатором коллекции.)

Компилятор автоматически вызовет Add() метод вашего класса с элементами в блоке инициализации коллекции.


В качестве примера, вот очень простой фрагмент кода для демонстрации:

 using System;
using System.Collections.ObjectModel;

class Test
{
    public Test()
    {
        this.Collection = new Collection<int>();
    }

    public Collection<int> Collection { get; private set; }

    public static void Main()
    {

        // Note the use of collection intializers here...
        Test test = new Test
            {
                Collection = { 3, 4, 5 }
            };


        foreach (var i in test.Collection)
        {
            Console.WriteLine(i);
        }

        Console.WriteLine("Press any key to exit...");
        Console.ReadKey();
    }  
}
  

Комментарии:

1. … и который реализует IEnumerable 🙂

2. @Jon: Совершенно верно — я отредактировал, чтобы быть более явным. (Я склонен всегда реализовывать IEnumerable в «коллекции», но на самом деле это не является обязательным требованием ;))

3. Да, но моя коллекция использует System.Collections.ObjectModel.Collection<T> , которая уже реализует IEnumerable и имеет метод Add(). Правда в том, что он не выдает никакой ошибки компиляции, но при повторении он кажется пустым.

4. Более того, ссылка, которую вы дали, не иллюстрирует этот тип инициализации.

5. @Jota: На самом деле это ссылка, которая показывает, как это работает. Я просто разместил несколько рабочих примеров кода для демонстрации. Попробуйте программу выше — она использует инициализаторы коллекции с Collection<T> , чтобы точно обработать этот сценарий.