Ответ
Кастомные коллекции в 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>и переопределить виртуальные методы. - Зачем это нужно? Чтобы добавить специфичную бизнес-логику (автоматическую сортировку, валидацию элементов, уведомления об изменениях) в контейнер для данных.