Stavo leggendo a blog da Eric Lippert dove ha spiegato perché ha quasi mai usare le matrici, e la parte seguente mi ha incuriosito:Qual è l'utilizzo di AsEnumerable() su un array?
Se si sta scrivendo un tale API, avvolgere la matrice in una ReadOnlyCollection e ritorno un oggetto IEnumerable o un IList o qualcosa, ma non un array. (E ovviamente non basta lanciare l'array a IEnumerable e pensare che hai finito! Sta ancora passando le variabili, il chiamante può semplicemente tornare ad array! Solo passare un array se è racchiuso da un sola lettura oggetto)
così ho dovuto vedermela un po 'con le collezioni:.
string[] array = new[] { "cat", "dog", "parrot" };
IEnumerable<string> test1 = array.AsEnumerable();
string[] secondArray = (string[])test1;
//array1[0] is now also "whale"
array[0] = "whale";
//11 interfaces
var iArray = array.GetType().GetInterfaces();
//Still 11 interfaces??
var iTest1 = test1.GetType().GetInterfaces();
ho inizializzare un array e quindi utilizzare il metodo AsEnumerable()
su di esso per convertirlo in un IEnumerable
(o giù di lì Ho pensato), ma quando lo ricollego a un nuovo array e cambio un valore nell'array originale, i valori di test1
e secondArray
cambiato in. A quanto pare ho appena fatto 2 nuovi riferimenti alla matrice originale, invece di creare un nuovo IEnumerable
un po 'come ToArray()
restituisce un nuovo array.
Quando si confrontano le interfacce dell'array e IEnumerable
, entrambi hanno le stesse interfacce. Perché la matrice ha quel metodo se in realtà non fa nulla? So che AsEnumerable()
ha i suoi usi con Linq-to-entities per ottenere i metodi enumerabili quando hai un IQueryable
, ma perché questo metodo dovrebbe essere aggiunto a un array? Esiste un uso pratico per questo metodo?
Edit: Questo commento di Tim Schmelter solleva un ottimo punto e non deve passare inosservato:
"Non è così inutile È possibile modificare il tipo effettivo senza rompere il resto del codice.. Quindi è possibile sostituire l'array con una query o elenco di database o hashset o altro, ma l'AsEnumerable funziona sempre e anche il resto del codice. Quindi AsEnumerable è come un contratto. "
forse questo può aiutare: il metodo http://stackoverflow.com/questions/2013846/why-use-asenumerable-rather-than-casting-to-ienumerablet – Domysee
'L'AsEnumerable (IEnumerable ) non ha alcun effetto altra piuttosto che modificare il tipo di origine in fase di compilazione da un tipo che implementa IEnumerable in IEnumerable . https://msdn.microsoft.com/library/bb335435(v=vs.100).aspx –
E le implicazioni di Quanto sopra (quello che ho citato) significa che puoi scorrere su di esso diversamente. Non so cos'altro offre. –