Добрый день, товарищи! Последнее время очень волнует вопрос оптимальности работы с 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);
то возможно ли создать метод-расширение для всех классов, у которых гарантировано есть индексатор?
Это не совсем так. Почти все методы 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--;
}
}
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Добрый день , совсем недавно начал учить программирование на js , это мой первый ЯП , хотел бы у вас узнать как работают циклы внутри циклов,...
Помогите с запуском проекта, накрывает ошибками при сборке вебпака https://githubcom/cjsheets/angular-voting-app Не могу разобраться с firebase для него, в ридми толком...