Essayons de penser en dehors de la boîte avec / par logique et de comprendre clairement ces trois interfaces dans votre question:
Lorsque la classe d'une instance implémente l'interface System.Collection.IEnumerable, en termes simples, nous pouvons dire que cette instance est à la fois énumérable et itérable, ce qui signifie que cette instance permet en quelque sorte dans une seule boucle d'aller / obtenir / passer / traverser / itérer sur / à travers tous les éléments et éléments que cette instance contient.
Cela signifie qu'il est également possible d'énumérer tous les éléments et éléments que cette instance contient.
Chaque classe qui implémente l'interface System.Collection.IEnumerable implémente également la méthode GetEnumerator qui ne prend aucun argument et renvoie une instance System.Collections.IEnumerator.
Les instances de l'interface System.Collections.IEnumerator se comportent de manière très similaire aux itérateurs C ++.
Lorsque la classe d'une instance implémente l'interface System.Collection.ICollection, alors, en termes simples, nous pouvons dire que cette instance est une collection de choses.
La version générique de cette interface, à savoir System.Collection.Generic.ICollection, est plus informative car cette interface générique indique explicitement quel est le type des éléments de la collection.
Tout cela est raisonnable, rationnel, logique et il est logique que l'interface System.Collections.ICollection hérite de l'interface System.Collections.IEnumerable, car théoriquement chaque collection est également à la fois énumérable et itérable et il est théoriquement possible de parcourir tous les éléments et éléments dans chaque collection.
L'interface System.Collections.ICollection représente une collection dynamique finie modifiable, ce qui signifie que les éléments existants peuvent être supprimés de la collection et que de nouveaux éléments peuvent être ajoutés à la même collection.
Cela explique pourquoi l'interface System.Collections.ICollection a les méthodes "Ajouter" et "Supprimer".
Étant donné que les instances de l'interface System.Collections.ICollection sont des collections finies, le mot "fini" implique que chaque collection de cette interface contient toujours un nombre fini d'éléments et d'éléments.
L'interface Count de System.Collections.ICollection de propriété suppose de renvoyer ce nombre.
L'interface System.Collections.IEnumerable n'a pas ces méthodes et propriétés que l'interface System.Collections.ICollection possède, car cela n'a aucun sens que System.Collections.IEnumerable aura ces méthodes et propriétés que l'interface System.Collections.ICollection possède.
La logique dit également que chaque instance à la fois énumérable et itérable n'est pas nécessairement une collection et pas nécessairement modifiable.
Quand je dis modifiable, je veux dire que vous ne pensez pas immédiatement que vous pouvez ajouter ou supprimer quelque chose à la fois énumérable et itérable.
Si je viens de créer une séquence finie de nombres premiers, par exemple, cette séquence finie de nombres premiers est en effet une instance de l'interface System.Collections.IEnumerable, car maintenant je peux parcourir tous les nombres premiers de cette séquence finie dans une seule boucle et faire tout ce que je veux faire avec chacun d'eux, comme imprimer chacun d'eux dans la fenêtre ou l'écran de la console, mais cette séquence finie de nombres premiers n'est pas une instance de l'interface System.Collections.ICollection, car cela n'a pas de sens pour ajouter des nombres composites à cette séquence finie de nombres premiers.
De plus, vous voulez que dans la prochaine itération, le premier nombre supérieur le plus proche soit le nombre premier actuel dans l'itération actuelle, si c'est le cas, vous ne voulez pas non plus supprimer les nombres premiers existants de cette séquence finie de nombres premiers.
Vous souhaitez également probablement utiliser, coder et écrire "yield return" dans la méthode GetEnumerator de l'interface System.Collections.IEnumerable pour produire les nombres premiers et ne rien allouer sur le tas de mémoire, puis charger le Garbage Collector (GC) à la fois désallouer et libérer cette mémoire du tas, car cela est évidemment à la fois un gaspillage de mémoire du système d'exploitation et une diminution des performances.
L'allocation de mémoire dynamique et la désallocation sur le tas doivent être effectuées lors de l'appel des méthodes et des propriétés de l'interface System.Collections.ICollection, mais pas lors de l'appel des méthodes et des propriétés de l'interface System.Collections.IEnumerable (bien que l'interface System.Collections.IEnumerable n'ait que 1 méthode et 0 propriétés).
Selon ce que d'autres ont dit dans cette page Web Stack Overflow, l'interface System.Collections.IList représente simplement une collection commandable et cela explique pourquoi les méthodes de l'interface System.Collections.IList fonctionnent avec des index contrairement à celles de l'interface System.Collections.ICollection.
En bref, l'interface System.Collections.ICollection n'implique pas qu'une instance de celle-ci peut être commandée, mais l'interface System.Collections.IList implique cela.
L'ensemble théoriquement ordonné est un cas spécial d'ensemble non ordonné.
Cela a également du sens et explique pourquoi l'interface System.Collections.IList hérite de l'interface System.Collections.ICollection.
List
devrait être beaucoup mieux, ouais?