Какие основные методы и свойства определяет интерфейс ICollection в .NET?

«Какие основные методы и свойства определяет интерфейс ICollection в .NET?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Интерфейс ICollection<T> наследует от IEnumerable<T> и добавляет функциональность для модификации коллекции и получения ее размера. Это базовый интерфейс для большинства изменяемых коллекций (List<T>, HashSet<T>, Dictionary<TKey, TValue>.KeyCollection).

Основные методы:

Метод Назначение
void Add(T item) Добавляет элемент в коллекцию.
bool Remove(T item) Удаляет первое вхождение указанного элемента. Возвращает true, если элемент был удален.
void Clear() Удаляет все элементы из коллекции.
bool Contains(T item) Определяет, содержит ли коллекция указанный элемент.

Основные свойства:

Свойство Назначение
int Count { get; } Возвращает количество элементов, содержащихся в коллекции. Важно: В отличие от Length у массивов, это свойство, а не поле.
bool IsReadOnly { get; } Получает значение, указывающее, является ли коллекция доступной только для чтения. Если true, методы Add, Remove, Clear выбросят NotSupportedException.

Практический пример и отличие от IEnumerable<T>:

// Работа через ICollection<T>
ICollection<string> collection = new List<string> { "A", "B" };

// Методы модификации (есть только в ICollection<T> и его наследниках)
collection.Add("C");
bool removed = collection.Remove("A"); // removed = true
collection.Clear();
collection.Add("X");
collection.Add("Y");

// Методы проверки
bool containsX = collection.Contains("X"); // true
int itemCount = collection.Count; // 2
bool isReadOnly = collection.IsReadOnly; // false (для List<T>)

// Работа через IEnumerable<T> (только перечисление, без модификации)
IEnumerable<string> enumerable = collection;
foreach (var item in enumerable)
{
    Console.WriteLine(item); // X, Y
}
// enumerable.Add("Z"); // ОШИБКА КОМПИЛЯЦИИ: Add не определен в IEnumerable<T>

Когда использовать? Используйте ICollection<T> в качестве типа параметра или возвращаемого значения, когда ваш метод должен читать и модифицировать коллекцию. Используйте IEnumerable<T> или IReadOnlyCollection<T>, если требуется только перечисление элементов.