Se si dispone di una funzione che accetta una raccolta di un determinato tipo, quale tipo di parametro dovrei usare?
Ho già supposto che IEnumerable
sia l'impostazione predefinita, ma vorrei sapere se questo è corretto e in tal caso, perché.
ICollection
sembra anche un candidato valido (a causa del suo nome), ma ho l'impressione che IEnumerables sia più user-friendly.
Ho pensato che esaminare gli esempi che il framework ci offre sarebbe una buona idea, ma trovo che qualcosa come String.Join
richieda una serie di stringhe.Parametri funzione: IEnumerable, ICollection o array?
risposta
Prendi quello che impone meno ai clienti ma ti consente di portare a termine il tuo lavoro. Se riesci a farla franca con IEnumerable<T>
su ICollection<T>
, dovresti usarla perché questo offre maggiore flessibilità ai client della tua API.
IEnumerable sono più preferiti su ICollections. Here è la risposta generosa alla tua domanda.
interfacce vengono per lo più utilizzati come parametri o tornare tipi di funzioni a supporto delle I
in SOLID
Design Principles (Interface segregazione linea di principio) per fare la fusione più facile, per supportare il passaggio più tipi concreti ai parametri interfacciati e nascondere (incapsulare) l'attuale tipo di parametro dai client delle tue funzioni pubbliche.
- Circa
IEnumerable
:
Molto semplice, espone l'enumeratore, che supporta una semplice iterazione su una collezione non generico.
[ComVisibleAttribute(true)]
public interface IEnumerable
- Ecco su
ICollection
: interfaccia
ICollection estende IEnumerable; IDictionary e IList sono interfacce più specializzate che estendono ICollection. Un'implementazione IDictionary è una raccolta di coppie chiave/valore, come la classe Hashtable. Un'implementazione di IList è una raccolta di valori e ai suoi membri è possibile accedere per indice, come la classe ArrayList. Alcune raccolte che limitano l'accesso ai loro elementi, come la classe Queue e la classe Stack, implementano direttamente l'interfaccia ICollection. Se né l'interfaccia IDictionary né l'interfaccia IList soddisfano i requisiti della raccolta richiesta, derivare invece la nuova classe di raccolta dall'interfaccia ICollection per una maggiore flessibilità.
[ComVisibleAttribute(true)]
public interface ICollection : IEnumerable
Ecco su
IList
interfaccia:[ComVisibleAttribute (true)] interfaccia pubblica IList: ICollection, IEnumerable
Altro da MSDN su IList: IList
è un discendente dall'interfaccia ICollection
ed è l'interfaccia di base di tutti i non generici STS. Le implementazioni di IList sono suddivise in tre categorie: di sola lettura, dimensioni fisse e dimensioni variabili. Un IList di sola lettura non può essere modificato.Un IList a dimensione fissa non consente l'aggiunta o la rimozione di elementi, ma consente la modifica di elementi esistenti. Un IList a dimensione variabile consente l'aggiunta, la rimozione e la modifica di elementi.
Suggerimento:
Nel caso in cui si desidera solo per sostenere
foreach
per il parametro di raccolta ,IEnumerable
dovrebbe essere sufficiente. Se si desidera anche il supporto per aggiungere e rimuovere elementi dalla raccolta,IList
è la scelta migliore.
Suggerimenti: Questo post del blog: IEnumerable, ICollection, IList Compared dovrebbe certamente di aiuto a prendere meglio e decisione precisa.
Inoltre, consultare this article per le prestazioni e altri confronti di IList e IEnumerable.
-1: Non potrei non essere più d'accordo. ** Sempre ** (per un determinato valore di sempre) usa l'astrazione minima che esegue il lavoro, in questo modo il codice cliente (il codice che stai scrivendo) non è vincolato all'utilizzo dello stesso contenitore, sei funzione diventa più generico e ha un maggiore potenziale di riutilizzo. –
Bene @BinaryWorrier Ho aggiornato la risposta per utilizzare IList come scelta solo quando è richiesto il supporto per aggiungere o rimuovere elementi e per utilizzare IEnumerable se è richiesto solo il supporto foreach..Spero che tu abbia capito meglio la risposta ora .. – VS1
ma non sono ancora d'accordo. 'IEnumerable
- 1. Perché ArrayList implementa IList, ICollection, IEnumerable?
- 2. Forza protobuf-net per ignorare le interfacce IEnumerable/ICollection
- 3. Quando esporre un oggetto IEnumerable invece di un ICollection?
- 4. Raccolta personalizzata utilizzando IEnumerable vs ICollection vs IList
- 5. SFINAE con parametri di tipo funzione o array non validi?
- 6. Conversione da IEnumerable <IEnumerable <string>> per ICollection <T>
- 7. Passando array funzione che prende sia oggetto params [] o IEnumerable <T>
- 8. Devo restituire un array o una collezione da una funzione?
- 9. convertire da Array per ICollection <T>
- 10. Perché utilizzare ICollection e non IEnumerable o List <T> su relazioni many-many/one-many?
- 11. Come posso aggiungere un IEnumerable <T> a un ICollection esistente <T>
- 12. ICollection vs ICollection <T> - ambiguità tra ICollection <T> Count e ICollection.Count
- 13. foreach on IEnumerable o IList
- 14. Perché l'Elenco implementa IList <T>, ICollection <T> e IEnumerable <T>?
- 15. Qual è il modo più semplice e compatto per creare un oggetto IEnumerable <T> o ICollection <T>?
- 16. Differenza tra IEnumerable e IEnumerable <T>?
- 17. Array e rvalues (come parametri)
- 18. Array Java come parametri
- 19. TestCase con lista o parametri
- 20. Scopo di TypeDependencyAttribute ("System.SZArrayHelper") per IList <T>, IEnumerable <T> e ICollection <T>?
- 21. C# 4.0: Parametri dei parametri come valori predefiniti come array
- 22. Funzione o metodo con numero sconosciuto di parametri
- 23. Dichiarare una funzione python con parametri di array e passare un argomento array alla chiamata di funzione?
- 24. conversione query LINQ per ICollection
- 25. Java Funzione Variadica parametri
- 26. più parametri opzionali funzione
- 27. funzione Swift parametri
- 28. Parametri funzione numero massimo
- 29. Parametri di funzione reattiva
- 30. Perché ICollection non contiene un metodo Aggiungi?
Questo è stato risposto prima qui: http://stackoverflow.com/questions/3559868/list-ilist-ienumerable-iqueryable-icollection-which-is-most-flexible-return migliore Saluti. – Oscar
['String.Join'] (http://msdn.microsoft.com/en-us/library/dd992421.aspx) ha aggiunto un sovraccarico nel periodo di tempo di .NET 4 in modo che richieda un' IEnumerable'. Il sovraccarico che prende le date dell'array dai giorni pre-generici ... –
@Oscar: si tratta del tipo di ritorno: sto parlando dei parametri. –