12
votes

Pourquoi n'est-ce pas itinérable implémenter ajouter (t)?

Tout simplement trouver par hasard, ajouter (t) est défini dans Icollection , au lieu de ienumerable . Et les méthodes d'extension en énumérables.cs ne contiennent pas d'ajout (t), que je pense est vraiment bizarre. Puisqu'un objet est énorme, il doit "ressembler" une collection d'articles. Quelqu'un peut-il me dire pourquoi?


1 commentaires

Avait ienumerable requis Ajouter Pour être mis en œuvre, il y aurait beaucoup plus de questions sur: pourquoi ienumerable avoir ajouter . La façon dont c'est, est très utile :)


6 Réponses :


11
votes

iEnumerable est pour la lecture, pas pour écrire.


0 commentaires

2
votes

Comme son nom le dit, vous pouvez énumérer (boucle) sur un iéenérable, et c'est à ce sujet. Lorsque vous voulez être capable d'ajouter quelque chose, ce ne serait plus qu'un énumérable, car il a des fonctionnalités supplémentaires.

Par exemple, un tableau est une matrice iSenumerable, mais un tableau a une longueur fixe, vous ne pouvez donc pas ajouter de nouveaux articles.

IEnumerable est juste la «base» pour toutes sortes de collections (même des collections libéonnées - qui n'ont évidemment pas d'ajout () méthode). Plus vous ajouteriez à une "interface de base", plus ce serait spécifique.


0 commentaires

47
votes

un ienumerable est juste une séquence d'éléments; voyez-le comme un curseur avant seulement. Étant donné que beaucoup de ces séquences génèrent des valeurs, des flux de données ou des ensembles d'enregistrements d'une base de données, cela n'a aucun sens à ce que ajoutez éléments.


1 commentaires

+1 pour utiliser le mot séquence , puisque iEnumerable est exactement cela, et pas une sorte de collection.



10
votes

Un énumérable est exactement cela - quelque chose que vous pouvez énumérer sur et découvrir tous les articles. Cela n'implique pas que vous pouvez y ajouter.

Être capable d'énumérer est universel à de nombreux types d'objets. Par exemple, il est partagé par des tableaux et des collections. Mais vous ne pouvez pas ajouter 'à un tableau sans gâcher avec sa structure - tandis qu'une collection est spécifiquement conçue pour être ajoutée et retirée de.

techniquement, vous pouvez "ajouter" à un énumérable, mais en utilisant concat <> - Cependant, tout cela est créé un énumérateur qui énumère d'un énumérable à la suivante - donnant à l'illusion d'un ensemble unique contigieux.


0 commentaires

2
votes

Le nom dit tout. IEnumerable est destiné à énumérer des objets uniquement. L'ICOLLECTION est la collecte effective des articles et prend donc en charge la méthode d'ajout.


0 commentaires

3
votes

chaque icollection code> devrait être iEnumerable code> (je pense, et l'équipe-cadre .NET semble être d'accord avec moi ;-)), mais l'inverse ne pas toujours avoir du sens. Il y a une hiérarchie de "collection comme des objets" dans ce monde, et votre hypothèse qu'un énumérable serait une collection que vous pouvez ajouter des articles à ne pas revenir dans cette hiérarchie.

Exemple: une liste de noms de couleur primaire serait un iEnumerable code> retourner "rouge" code>, "bleu" code> et "vert" code>. Il ne ferait aucun sens logique de pouvoir faire un primaireColors.add ("Violet vif") Code> sur une "collection" remplie comme ceci: p>

...whatever...
{
    ...
    var primaryColors = EnumeratePrimaryColors();
    ...
}

private static IEnumerable<string> EnumeratePrimaryColors() {
    yield return "Red";
    yield return "Blue";
    yield return "Green";
}


1 commentaires

icollection hérités de iEnumerable et icollection hérite de ienumerable (qui hérite de IEnumerable ). En d'autres termes, vous avez raison: chaque icollection est un ienumerable .