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

134
02 марта 2018, 13:41

Добрый день, товарищи! Последнее время очень волнует вопрос оптимальности работы с Linq. Один знакомый уверял меня, что когда я вызываю .ElementAt(N), то за сценой происходит нечто подобное:

public static T ElementAt<T>(this IEnumerable<T> 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);

то возможно ли создать метод-расширение для всех классов, у которых гарантировано есть индексатор?

Answer 1

Это не совсем так. Почти все методы linq сначала делают проверку на список. Но если ты и так знаешь, что там список, то используй скобки, а не linq. Они же даже короче.

public static TSource ElementAt<TSource>(this IEnumerable<TSource> source, int index) {
    if (source == null) throw Error.ArgumentNull("source");
    IList<TSource> list = source as IList<TSource>;
    if (list != null) return list[index];
    if (index < 0) throw Error.ArgumentOutOfRange("index");
    using (IEnumerator<TSource> e = source.GetEnumerator()) {
        while (true) {
            if (!e.MoveNext()) throw Error.ArgumentOutOfRange("index");
            if (index == 0) return e.Current;
            index--;
        }
    }
}
READ ALSO
Циклы , loops , как работает цикл внутри цикла?

Циклы , loops , как работает цикл внутри цикла?

Добрый день , совсем недавно начал учить программирование на js , это мой первый ЯП , хотел бы у вас узнать как работают циклы внутри циклов,...

219
Помогите запустить проект

Помогите запустить проект

Помогите с запуском проекта, накрывает ошибками при сборке вебпака https://githubcom/cjsheets/angular-voting-app Не могу разобраться с firebase для него, в ридми толком...

157