Страницы

Поиск по вопросам

воскресенье, 21 октября 2018 г.

Насколько оптимальна работа с System.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);
то возможно ли создать метод-расширение для всех классов, у которых гарантировано есть индексатор?


Ответ

Это не совсем так. Почти все методы 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--; } } }

Комментариев нет:

Отправить комментарий