Ответ
Интерфейс 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>, если требуется только перечисление элементов.