Страницы

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

суббота, 14 декабря 2019 г.

Насколько оптимальна работа с System.Linq?

#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--; } } }

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

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