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

Ответ

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

Ответ 18+ 🔞

Давай разберём эту штуку, как есть, без соплей и заумных терминов. Интерфейс ICollection<T> — это как IEnumerable<T>, только с прикрученными кулаками. Если IEnumerable<T> умеет только по коллекции ползать и элементы показывать, то ICollection<T> уже может её пинать, менять и вообще понимать, что там внутри творится.

Короче, что он умеет делать, чего не умеет IEnumerable<T>:

Метод Что делает?
void Add(T item) Запихивает новый элемент в коллекцию.
bool Remove(T item) Выкидывает первый попавшийся такой же элемент. Говорит true, если получилось, а если такого нет — false.
void Clear() Выносит всё нахуй из коллекции. Полный зачист.
bool Contains(T item) Пытается понять, есть ли такой элемент внутри. Не гадает, а реально ищет.

А ещё у него есть полезные свойства:

Свойство Зачем нужно?
int Count { get; } Показывает, сколько элементов внутри. Это не как у массивов (Length), а именно свойство, которое может считать на лету.
bool IsReadOnly { get; } Говорит, можно ли коллекцию трогать. Если true — попробуй вызови Add или Remove, получишь исключение в ебало.

Смотри, как это работает на практике:

// Берём List<string>, но смотрим на него через призму ICollection<T>
ICollection<string> collection = new List<string> { "A", "B" };

// Вот это уже можно делать (а через IEnumerable<T> — нихуя)
collection.Add("C"); // Добавили "C"
bool removed = collection.Remove("A"); // removed = true, потому что "A" нашли и выкинули
collection.Clear(); // Всё стёрли
collection.Add("X");
collection.Add("Y"); // Теперь внутри ["X", "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"); // А вот это уже не скомпилируется — IEnumerable<T> не даст ничего добавить, ёпта!

Так когда это использовать-то?
Если твой метод должен не только читать коллекцию, но и добавлять/удалять элементы — бери ICollection<T>.
Если нужно только перечислять — хватит IEnumerable<T> или IReadOnlyCollection<T>. Не усложняй, блядь, там, где не надо.