Ho una domanda sull'ordinazione in IEnumerable
(o IEnumerable<T>
, non importa).IEnumerable and order
Come sappiamo, scorrendo IEnumerable è pseudo-codice può essere scritto nel modo seguente:
while (enumerable.HasNext())
{
object obj = enumerable.Current;
...
}
Ora, assumere, che si ha la necessità di operare su un ordinato raccolta. È possibile utilizzare IEnumerable in questo caso o è meglio provare altri metodi (ad esempio IList
) con supporto per l'indicizzazione?
In altre parole: si fa il contratto di IEnumerable
assumersi alcuna responsabilità circa l'ordine in generale?
UPD: Quindi, IEnumerable
non è una media adeguata per un'interfaccia generica che garantisce l'ordine. La nuova domanda è quale interfaccia o classe dovrebbe essere utilizzata per una collezione immutabile con ordine?? ReadonlyCollection
? IList
? Entrambi contengono il metodo Add()
(anche se non è implementato in quello precedente). Qualche suggerimento?
P.S I miei pensieri: IEnumerable
non fornisce alcuna garanzia circa l'ordinamento. La corretta attuazione potrebbe tornare stessi elementi in ordine differente in differenti enumerazioni (considerare una query SQL)
P.P.S. Sono a conoscenza di LINQ First()
, ma se IEnumerable
non dice una parola riguardo al suo ordinamento, questa estensione è piuttosto inutile.
Un altro esempio è 'Dizionario <,>'. È chiaramente documentato che l'ordine in cui sono enumerate le sue voci non è definito. Quindi codice come 'dict.Last(). Key' (dove' dict' è un 'Dictionary <,>' e 'Last()' è il metodo di estensione LINQ) non ha senso. (Ho sentito che uno sviluppatore ha fatto esattamente questo). –
Aggiungo che ho già detto che è importante capire correttamente le garanzie sull'ordine per alcune raccolte generiche. Quindi la garanzia dell'ordine non riguarda un particolare ordine (per esempio, come risultato dell'ordinamento), ma garantisce che l'ordine degli elementi della stessa collezione sia lo stesso per le successive enumerazioni. La maggior parte delle collezioni non lo garantisce esplicitamente. IList rappresenta solo un tipo di dizionario in cui le chiavi sono indici. –
IOrderedEnumerable può essere un segno per credere che la raccolta garantisce l'ordine (sebbene l'interfaccia non sia ancora), ma è più del necessario - di solito rappresenta un particolare ordine SORT, mentre abbiamo bisogno di QUALSIASI ordine (casuale) che sia solo garantito tra le numerazioni. Per concludere, solo l'implementazione concreta può davvero garantire l'ordine (ad esempio Array, List). –