Proprio ora lo troviamo per caso, Aggiungi (T) è definito in ICollection<T>
, anziché IEnumerable<T>
. E i metodi di estensione in Enumerable.cs non contengono Add (T), che a mio avviso è davvero strano. Poiché un oggetto è enumerabile, deve "assomigliare" ad una collezione di elementi. Qualcuno può dirmi perché?Perché IEnumerable <T> implementa Aggiungi (T)?
risposta
Un IEnumerable<T>
è solo una sequenza di elementi; vederlo come un cursore solo in avanti. Poiché molte di queste sequenze generano valori, flussi di dati o set di record da un database, non ha alcun senso per gli elementi Add
.
+1 per usare la parola * sequenza *, poiché IEnumerable è esattamente questo, e non una specie di collezione. – OregonGhost
I downvoters potrebbero spiegare perché hanno downvoted? – Steven
IEnumerable
è per la lettura, non per la scrittura.
Come dice il nome, è possibile enumerare (loop) su un oggetto IEnumerable, e questo è quanto. Quando si vuole essere in grado di aggiungervi qualcosa, non sarebbe più solo un enumerabile, poiché ha caratteristiche extra.
Ad esempio, un array è un oggetto IEnumerable, ma un array ha una lunghezza fissa, quindi non è possibile aggiungere nuovi elementi.
IEnumerable è solo la 'base' per tutti i tipi di raccolte (anche raccolte di sola lettura, che ovviamente non hanno alcun metodo Add()). Più funzionalità si aggiungerebbero a tale 'interfaccia di base', più specifica sarebbe.
Un enumerable è esattamente questo - qualcosa che è possibile elencare e scoprire tutti gli elementi. Non implica che tu possa aggiungervi.
Essere in grado di enumerare è universale per molti tipi di oggetti. Ad esempio, è condiviso da matrici e raccolte. Ma non è possibile "aggiungere" a un array senza fare confusione con la sua struttura - mentre una Collezione è specificamente costruita per essere aggiunta e rimossa.
Tecnicamente è possibile "aggiungere" ad una numerazione, tuttavia - utilizzando Concat<>
- tuttavia tutto ciò è creare un enumeratore che enumeri da una enumerabile alla successiva, dando l'illusione di un singolo insieme contorsivo.
+1 per suggerire un'alternativa, il Concat. – Emile
Il nome dice tutto. IEnumerable è solo per enumerazione di elementi. ICollection è la raccolta effettiva di elementi e quindi supporta il metodo Aggiungi.
Ogni ICollection
deve essere IEnumerable
(penso, e il team di .NET Framework sembra essere d'accordo con me ;-)), ma il contrario non ha sempre senso. Esiste una gerarchia di "collezione come oggetti" in questo mondo, e la tua ipotesi che un enumerabile sarebbe una collezione a cui è possibile aggiungere oggetti non vale in quella gerarchia.
Esempio: un elenco di nomi di colori primari sarebbe un IEnumerable
restituendo "Red"
, "Blue"
e "Green"
. Non avrebbe alcun senso logico a tutti di essere in grado di fare un primaryColors.Add("Bright Purple")
su una "collezione" pieni come questo:
...whatever...
{
...
var primaryColors = EnumeratePrimaryColors();
...
}
private static IEnumerable<string> EnumeratePrimaryColors() {
yield return "Red";
yield return "Blue";
yield return "Green";
}
- 1. Perché l'Elenco implementa IList <T>, ICollection <T> e IEnumerable <T>?
- 2. Perché IEnumerable <T> è definito come IEnumerable <out T>, non IEnumerable <T>
- 3. IEnumerable <IEnumerable <T>> per IEnumerable <T> utilizzando LINQ
- 4. Perché l'elenco (<T> implementa tutte queste interfacce, non solo IList <T>?
- 5. IEnumerable <T> conversione
- 6. Casting IEnumerable <T> a Elenco <T>
- 7. IEnumerable <T> e IQueryable <T> chiarimenti?
- 8. restituendo un IEnumerable generico <T>
- 9. Differenza tra IEnumerable e IEnumerable <T>?
- 10. Perché IEnumerable <T> ha metodi FindAll o RemoveAll?
- 11. Perché il set F # non implementa ISet <T>?
- 12. Perché l'Elenco <T>. PerEgni() implementa un ciclo for?
- 13. Come concatenare due IEnumerable <T> in un nuovo IEnumerable <T>?
- 14. DataTables vs IEnumerable <T>
- 15. Perché non posso trasmettere un elenco IEnumerable <T> a BindingList <t>?
- 16. Perché HashSet <T> non implementa IReadOnlyCollection <T>?
- 17. Scopo di TypeDependencyAttribute ("System.SZArrayHelper") per IList <T>, IEnumerable <T> e ICollection <T>?
- 18. EditorFor IEnumerable <T> con TemplateName
- 19. Perché ArrayList implementa IList, ICollection, IEnumerable?
- 20. IEnumerable <T> in C#
- 21. esportazione IEnumerable <T> in Excel
- 22. Convertire IEnumerable <T> a string []
- 23. Concatenare più IEnumerable <T>
- 24. Come funziona IEnumerable <T>. Reverse?
- 25. XML per IEnumerable <T>
- 26. Come per ruotare IEnumerable <T>
- 27. L'elenco <T> non implementa SyncRoot!
- 28. Come implementare IEnumerable <T> con GetEnumerator()?
- 29. IList <T> vs IEnumerable <T>. Cosa è più efficiente IList <T> o IEnumerable <T>
- 30. serializzazione Json.net della raccolta personalizzata che implementa IEnumerable <T>
Had 'IEnumerable' 'necessari add' da attuare, non ci sarebbe molto di più domande le in altre parole: * Perché 'IEnumerable ' ha 'Aggiungi' *. Il modo in cui è, è molto utile :) –
nawfal