Vamos tentar pensar fora da caixa com / pela lógica e entender claramente essas três interfaces na sua pergunta:
Quando a classe de alguma instância implementa a interface System.Collection.IEnumerable, então, em palavras simples, podemos dizer que essa instância é enumerável e iterável, o que significa que essa instância permite de alguma forma em um único loop ir / obter / passar / percorra / itere sobre / através de todos os itens e elementos que esta instância contém.
Isso significa que também é possível enumerar todos os itens e elementos que esta instância contém.
Toda classe que implementa a interface System.Collection.IEnumerable também implementa o método GetEnumerator que não usa argumentos e retorna uma instância de System.Collections.IEnumerator.
Instâncias da interface System.Collections.IEnumerator se comportam muito semelhantes aos iteradores do C ++.
Quando a classe de alguma instância implementa a interface System.Collection.ICollection, em palavras simples, podemos dizer que essa instância é uma coleção de coisas.
A versão genérica dessa interface, ou seja, System.Collection.Generic.ICollection, é mais informativa porque essa interface genérica declara explicitamente qual é o tipo de itens na coleção.
Tudo isso é razoável, racional, lógico e faz sentido que a interface System.Collections.ICollection herda da interface System.Collections.IEnumerable, porque teoricamente toda coleção também é enumerável e iterável e, teoricamente, é possível passar por todos os itens e elementos em toda coleção.
A interface System.Collections.ICollection representa uma coleção dinâmica finita que pode ser alterada, o que significa que os itens existentes podem ser removidos da coleção e novos itens podem ser adicionados à mesma coleção.
Isso explica por que a interface System.Collections.ICollection possui os métodos "Adicionar" e "Remover".
Como essas instâncias da interface System.Collections.ICollection são coleções finitas, a palavra "finito" implica que toda coleção dessa interface sempre possui um número finito de itens e elementos.
A propriedade Count da interface System.Collections.ICollection supõe retornar esse número.
A interface System.Collections.IEnumerable não possui esses métodos e propriedades que a interface System.Collections.ICollection possui, porque não faz sentido que System.Collections.IEnumerable tenha esses métodos e propriedades que a interface System.Collections.ICollection possui.
A lógica também diz que toda instância que é enumerável e iterável não é necessariamente uma coleção e não é necessariamente mutável.
Quando digo mutável, quero dizer que não pense imediatamente que você pode adicionar ou remover algo de algo que é enumerável e iterável.
Se eu apenas criei uma sequência finita de números primos, por exemplo, essa sequência finita de números primos é de fato uma instância da interface System.Collections.IEnumerable, porque agora posso revisar todos os números primos dessa sequência finita em um único loop e faça o que eu quiser com cada um deles, como imprimir cada um deles na janela ou na tela do console, mas essa sequência finita de números primos não é uma instância da interface System.Collections.ICollection, porque isso não faz sentido. adicione números compostos a essa sequência finita de números primos.
Além disso, na próxima iteração você deseja obter o próximo número primo maior e mais próximo do número primo atual na iteração atual. Caso contrário, também não deseja remover os números primos existentes dessa sequência finita de números primos.
Além disso, você provavelmente deseja usar, codificar e escrever "yield return" no método GetEnumerator da interface System.Collections.IEnumerable para produzir os números primos e não alocar nada no heap da memória e depois executar tarefas no Garbage Collector (GC) para ambos. desalocar e liberar essa memória do heap, porque obviamente isso é desperdício de memória do sistema operacional e diminui o desempenho.
A alocação e desalocação dinâmica de memória no heap devem ser feitas ao invocar os métodos e propriedades da interface System.Collections.ICollection, mas não ao invocar os métodos e propriedades da interface System.Collections.IEnumerable (embora a interface System.Collections.IEnumerable tenha apenas 1 método e 0 propriedades).
De acordo com o que outros disseram nesta página do Stack Overflow, a interface System.Collections.IList simplesmente representa um pedido coleção e isso explica por que os métodos da interface System.Collections.IList funcionam com índices em contraste com os da interface System.Collections.ICollection.
Em resumo, a interface System.Collections.ICollection não implica que uma instância dela possa ser solicitada, mas a interface System.Collections.IList implica isso.
Conjunto teórico ordenado é um caso especial de conjunto não ordenado.
Isso também faz sentido e explica por que a interface System.Collections.IList herda a interface System.Collections.ICollection.
List
deveria ser muito melhor, né?