2010-08-27 16 views
12

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)?

+0

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

risposta

45

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.

+9

+1 per usare la parola * sequenza *, poiché IEnumerable è esattamente questo, e non una specie di collezione. – OregonGhost

+5

I downvoters potrebbero spiegare perché hanno downvoted? – Steven

11

IEnumerable è per la lettura, non per la scrittura.

2

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.

10

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.

+0

+1 per suggerire un'alternativa, il Concat. – Emile

2

Il nome dice tutto. IEnumerable è solo per enumerazione di elementi. ICollection è la raccolta effettiva di elementi e quindi supporta il metodo Aggiungi.

3

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"; 
} 
+0

'ICollection' eredita da' IEnumerable' e 'ICollection ' eredita da 'IEnumerable ' (che eredita da 'IEnumerable'). In altre parole, hai ragione: ogni 'ICollection' è un' IEnumerable'. – Steven

+0

@Steven: lo so ... – peSHIr

Problemi correlati