2012-06-11 13 views
6

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?

+1

Questo è stato risposto prima qui: http://stackoverflow.com/questions/3559868/list-ilist-ienumerable-iqueryable-icollection-which-is-most-flexible-return migliore Saluti. – Oscar

+3

['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 ... –

+7

@Oscar: si tratta del tipo di ritorno: sto parlando dei parametri. –

risposta

10

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.

3

IEnumerable sono più preferiti su ICollections. Here è la risposta generosa alla tua domanda.

1

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.

+2

-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. –

+0

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

+0

ma non sono ancora d'accordo. 'IEnumerable ' dovrebbe essere preferito in quanto è l'astrazione minima. per esempio. Immagina di avere una funzione che prende una lista di numeri e ottiene il minimo, il massimo e la media. Se la funzione accetta una ICollection, può essere utilizzata da qualsiasi classe che implementa la raccolta I. Se è stato scritto per prendere IEnumerable, può funzionare su _anything_, dato che si scrive facilmente un adattatore per DataReader o lettori di file che restituiscono gli articoli restituiti senza causare ulteriore memoria o sovraccarico di elaborazione e continuano a utilizzare la stessa funzione. –

Problemi correlati