#c_sharp #linq #производительность
Волнует вопрос оптимальности работы с LINQ. Один знакомый уверял меня, что когда я вызываю .ElementAt(N), то за сценой происходит нечто подобное: public static T ElementAt(this IEnumerable Data, int Index) { if (Index < 0) throw new ArgumentOutOfRangeException(); int i = 0; foreach(T x in Data) if (i++ == Index) return x; throw new ArgumentOutOfRangeException(); } Как мы понимаем, эту куда медленнее, чем просто получить элемент по индексу в том же массиве, листе и прочем. Если это действительно так, и a[999]; // int[] a = new int[1000]; отработает в ~1000 раз быстрее, чем a.ElementAt(999); то возможно ли создать метод-расширение для всех классов, у которых гарантировано есть индексатор?
Ответы
Ответ 1
Это не совсем так. Почти все методы LINQ сначала делают проверку на список. Но если ты и так знаешь, что там список, то используй скобки, а не LINQ. Они же даже короче. public static TSource ElementAt(this IEnumerable source, int index) { if (source == null) throw Error.ArgumentNull("source"); IList list = source as IList ; if (list != null) return list[index]; if (index < 0) throw Error.ArgumentOutOfRange("index"); using (IEnumerator e = source.GetEnumerator()) { while (true) { if (!e.MoveNext()) throw Error.ArgumentOutOfRange("index"); if (index == 0) return e.Current; index--; } } }
Комментариев нет:
Отправить комментарий