Proviamo a pensare fuori dagli schemi con / per logica e comprendere chiaramente queste tre interfacce nella tua domanda:
Quando la classe di qualche istanza implementa l'interfaccia System.Collection.IEnumerable allora, in parole semplici, possiamo dire che questa istanza è sia enumerabile che iterabile, il che significa che questa istanza consente in qualche modo in un singolo ciclo di andare / ottenere / passare / attraversa / scorre su / attraverso tutti gli elementi e gli elementi che contiene questa istanza.
Ciò significa che è anche possibile enumerare tutti gli elementi e gli elementi contenuti in questa istanza.
Ogni classe che implementa l'interfaccia System.Collection.IEnumerable implementa anche il metodo GetEnumerator che non accetta argomenti e restituisce un'istanza System.Collections.IEnumerator.
Le istanze dell'interfaccia System.Collections.IEnumerator si comportano in modo molto simile agli iteratori C ++.
Quando la classe di qualche istanza implementa l'interfaccia System.Collection.ICollection, in parole semplici, possiamo dire che questa istanza è una raccolta di cose.
La versione generica di questa interfaccia, ovvero System.Collection.Generic.ICollection, è più informativa perché questa interfaccia generica indica esplicitamente quale sia il tipo di cose nella raccolta.
Tutto ciò è ragionevole, razionale, logico e ha senso che l'interfaccia System.Collections.ICollection eredita dall'interfaccia System.Collections.IEnumerable, perché teoricamente ogni raccolta è anche enumerabile e iterabile e ciò è teoricamente possibile esaminare tutti gli elementi e gli elementi in ogni collezione.
L'interfaccia System.Collections.ICollection rappresenta una raccolta dinamica finita che è modificabile, il che significa che gli elementi esistenti possono essere rimossi dalla raccolta e nuovi elementi possono essere aggiunti alla stessa raccolta.
Questo spiega perché l'interfaccia System.Collections.ICollection ha i metodi "Aggiungi" e "Rimuovi".
Poiché tali istanze dell'interfaccia System.Collections.ICollection sono raccolte finite, la parola "finita" implica che ogni raccolta di questa interfaccia contiene sempre un numero finito di elementi ed elementi.
La proprietà Count dell'interfaccia System.Collections.ICollection suppone di restituire questo numero.
L'interfaccia System.Collections.IEnumerable non ha questi metodi e proprietà dell'interfaccia System.Collections.ICollection, perché non ha alcun senso che System.Collections.IEnumerable abbia questi metodi e proprietà dell'interfaccia System.Collections.ICollection.
La logica dice anche che ogni istanza che è sia enumerabile che iterabile non è necessariamente una raccolta e non è necessariamente modificabile.
Quando dico mutevole, intendo che non penso immediatamente che puoi aggiungere o rimuovere qualcosa da qualcosa che è sia enumerabile che iterabile.
Se ho appena creato una sequenza finita di numeri primi, ad esempio, questa sequenza finita di numeri primi è davvero un'istanza di System.Collections.IEnumerabile interfaccia, perché ora posso esaminare tutti i numeri primi in questa sequenza finita in un singolo ciclo e fare qualunque cosa io voglia fare con ciascuno di essi, come stampare ciascuno di essi sulla finestra o sullo schermo della console, ma questa sequenza finita di numeri primi non è un'istanza dell'interfaccia System.Collections.ICollection, perché non ha senso aggiungere numeri compositi a questa sequenza finita di numeri primi.
Inoltre, nella prossima iterazione si desidera ottenere il prossimo numero primo più vicino più vicino al numero primo corrente nell'iterazione corrente, se così non si desidera rimuovere anche i numeri primi esistenti da questa sequenza finita di numeri primi.
Inoltre, probabilmente si desidera utilizzare, codificare e scrivere "rendimento restituito" nel metodo GetEnumerator dell'interfaccia System.Collections.IEnumerable per produrre i numeri primi e non allocare nulla sull'heap di memoria e quindi assegnare Garbage Collector (GC) a entrambi dislocare e liberare questa memoria dall'heap, poiché questo è ovviamente sia uno spreco di memoria del sistema operativo che una riduzione delle prestazioni.
L'allocazione dinamica della memoria e la deallocazione sull'heap devono essere eseguite quando si invocano i metodi e le proprietà dell'interfaccia System.Collections.ICollection, ma non quando si invocano i metodi e le proprietà dell'interfaccia System.Collections.IEnumerable (sebbene l'interfaccia System.Collections.IEnumerable abbia solo 1 metodo e 0 proprietà).
Secondo quanto affermato da altri in questa pagina Web Stack Overflow, l'interfaccia System.Collections.IList rappresenta semplicemente una raccolta ordinabile e questo spiega perché i metodi dell'interfaccia System.Collections.IList funzionano con gli indici in contrasto con quelli dell'interfaccia System.Collections.ICollection.
In breve l'interfaccia System.Collections.ICollection non implica che un'istanza di essa sia ordinabile, ma l'interfaccia System.Collections.IList lo implica.
Il set ordinato teoricamente è un caso speciale di set non ordinato.
Questo ha anche senso e spiega perché l'interfaccia System.Collections.IList eredita l'interfaccia System.Collections.ICollection.
List
dovrebbe essere molto meglio, sì?