Ответ
Интерфейс 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>. Не усложняй, блядь, там, где не надо.