Рассмотрим этот код:Понимание расширения ElementAt (индекс)
int size = 100 * 1000 * 1000;
var emu = Enumerable.Range(0, size);
var arr = Enumerable.Range(0, size).ToArray();
, когда я называю emu.ElementAt (размер-10) и arr.ElementAt (размер-10) и измеряют время обр гораздо быстрее (массив равен 0,0002s по сравнению с IEnumerable 0,59s).
Как я понимаю, методы продления ElementAt() есть подпись,
public static TSource ElementAt<TSource>(this IEnumerable<TSource> source, int index)
и с «источника» является IEnumerable логика осуществляется бы подобным - в отличии от того, что я вижу, где массив доступен напрямую.
Может кто-то пожалуйста, объясните это :)
Вы можете несколько косвенно отказаться от оптимизации, указав, что ваш пользовательский тип коллекции реализует 'IList', но реализуйте его явно и/или только когда-либо публиковате свою коллекцию как« IEnumerable '. Это не идеально, но в принципе это оптимизационные «крючки». Если бы вы этого захотели, вы могли бы предоставить настраиваемый интерфейс для каждого настраиваемого метода расширения, который позволяет сценаристу класса переопределить поведение метода расширения, хотя это может немного захлаться. Что-то вроде 'WidgetExtensions.ToggleWidget (этот виджет виджетов) 'и' WidgetExtensions.IToggleWidget '. –