Considerate questo codice:Capire l'estensione ElementAt (indice)
int size = 100 * 1000 * 1000;
var emu = Enumerable.Range(0, size);
var arr = Enumerable.Range(0, size).ToArray();
quando chiamo emu.ElementAt (dimensioni-10) e arr.ElementAt (dimensioni-10) e misurare il tempo del arr è molto più veloce (la matrice è 0,0002s rispetto a IEnumerable 0.59s).
quanto mi risulta, il metodo estensione ElementAt() hanno la firma
public static TSource ElementAt<TSource>(this IEnumerable<TSource> source, int index)
e dato che la 'sorgente' è un IEnumerable logica effettuata sarebbe simile - contrario di ciò che vedo dove la matrice è accessibile direttamente.
Qualcuno potrebbe spiegare questo :)
Puoi optare in qualche modo indirettamente per le ottimizzazioni avendo il tuo tipo di raccolta personalizzato implementare 'IList', ma implementarlo esplicitamente e/o esporre la tua raccolta pubblicamente come 'IEnumerable '. Non è l'ideale, ma fondamentalmente questi sono i "ganci" di ottimizzazione. Se lo si desidera, è possibile fornire un'interfaccia personalizzata per ciascun metodo di estensione personalizzato che consenta a un autore della classe di sovrascrivere il comportamento del metodo di estensione, anche se potrebbe risultare un po 'ingombrante. (questo widget Widget) 'e' WidgetExtensions.IToggleWidget '. –