Как реализовать кастомную коллекцию в C#?

«Как реализовать кастомную коллекцию в C#?» — вопрос из категории Основы программирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Кастомные коллекции в C# создаются путем реализации стандартных интерфейсов (IEnumerable<T>, ICollection<T>, IList<T>) или наследования от абстрактных классов (CollectionBase). Это позволяет интегрировать коллекцию в экосистему .NET (работать с foreach, LINQ).

Базовый пример: простая коллекция, реализующая IEnumerable<T>:

public class CustomCollection<T> : IEnumerable<T>
{
    private readonly List<T> _items = new List<T>();

    // Кастомный метод добавления с логированием
    public void Add(T item)
    {
        Console.WriteLine($"Adding item: {item}");
        _items.Add(item);
    }

    // Реализация IEnumerable<T> для поддержки foreach и LINQ
    public IEnumerator<T> GetEnumerator() => _items.GetEnumerator();
    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}

// Использование
var numbers = new CustomCollection<int> { 1, 2, 3 };
foreach (var num in numbers)
{
    Console.WriteLine(num); // Вывод: 1, 2, 3
}

Ключевые моменты и best practices:

  • IEnumerable<T> — минимальный интерфейс для итерации. Для изменения коллекции нужен ICollection<T>.
  • IList<T> — добавляет индексацию (list[0]).
  • Для изменения поведения стандартных операций (например, Add) можно наследоваться от Collection<T> и переопределить виртуальные методы.
  • Зачем это нужно? Чтобы добавить специфичную бизнес-логику (автоматическую сортировку, валидацию элементов, уведомления об изменениях) в контейнер для данных.