consideran este código:Entender la extensión ElementAt (índice)
int size = 100 * 1000 * 1000;
var emu = Enumerable.Range(0, size);
var arr = Enumerable.Range(0, size).ToArray();
cuando llamo emu.ElementAt (tamaño 10) y arr.ElementAt (tamaño 10) y medir el tiempo que el arr es mucho más rápido (el conjunto es 0.0002s en comparación con IEnumerable 0.59s).
Según tengo entendido, el método de extensión ElementAt() tiene la firma
public static TSource ElementAt<TSource>(this IEnumerable<TSource> source, int index)
y desde la 'fuente' es un IEnumerable la lógica llevada a cabo sería similar - en contraposición a lo que veo en la matriz se accede directamente.
Podría alguien explicar esto :)
Puede optar indirectamente por las optimizaciones haciendo que su tipo de colección personalizada implemente 'IList', pero impleméntelo explícitamente y/o exponga públicamente su colección como 'IEnumerable '. No es ideal, pero básicamente estos son los 'ganchos' de optimización. Si lo desea, podría proporcionar una interfaz personalizada para cada método de extensión personalizado que permita a un escritor de clase anular el comportamiento del método de extensión, aunque esto podría ser un poco desordenado. Algo como 'WidgetExtensions.ToggleWidget (este widget Widget) 'y' WidgetExtensions.IToggleWidget '. –