Пытаюсь разобраться в том, как работают лямбда-функции и увидел на метаните, как он проделывает следующее:
delegate Operation (int x, int y);
Operation operation = (x, y) => x+y;
Я правильно понимаю, что лямбда функция является короткой записью реализации делегата или нет?
И вот пытался понять, как работают методы в LINQ, ведь там тоже используются лямбда-выражения, например
var s = context.Users.Where(p => p.Id == 3)
.
Поэтому я выделил Where, нажал F12 и увидел следующее:
public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate);
Этот метод является частью класса Queryable, но не понимаю, что это за конструкция, почему нет тела, где прописан непосредственно алгоритм метода?
Подскажите, пожалуйста, как можно найти похожие конструкции или что-то еще, чтобы понять, как это работает
По первой части вопроса: да, правильно понимаете.
Исторически, сначала в c# 1.1 появились делегаты и анонимные функции (как экземпляры делегатов).
А вот потом уже в c# 3.0 появились лямбда-функции, как способ краткой записи анонимных функций. Ну удобнее же сразу записать без лишнего бойлерплейт кода (делегат обьяви, его тело объяви...)
По второй части вопроса.
Насколько я понял, вас интересуют extension methods и работа this.
Также может быть вы хотите посмотреть код метода, у меня стоит решарпер, который подгружает исходники или декомпилирует их, вот что мне показывает по F12:
public static IQueryable<TSource> Where<TSource>(
this IQueryable<TSource> source,
Expression<Func<TSource, bool>> predicate)
{
if (source == null)
throw Error.ArgumentNull(nameof (source));
if (predicate == null)
throw Error.ArgumentNull(nameof (predicate));
return source.Provider.CreateQuery<TSource>((Expression) Expression.Call((Expression) null, CachedReflectionInfo.Where_TSource_2(typeof (TSource)), source.Expression, (Expression) Expression.Quote((Expression) predicate)));
}
Больше примеров можете посмотреть там же в студии -- начните изучение с простых linq-выражений и лучше сначала не хвататься за IQueryable, а понять IEnumerable, например:
source.Sum(x => x.Id);
Под капотом выглядит как:
/// <summary>Computes the sum of the sequence of <see cref="T:System.Int32" /> values that are obtained by invoking a transform function on each element of the input sequence.</summary>
/// <returns>The sum of the projected values.</returns>
/// <param name="source">A sequence of values that are used to calculate a sum.</param>
/// <param name="selector">A transform function to apply to each element.</param>
/// <typeparam name="TSource">The type of the elements of <paramref name="source" />.</typeparam>
/// <exception cref="T:System.ArgumentNullException">
/// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
/// <exception cref="T:System.OverflowException">The sum is larger than <see cref="F:System.Int32.MaxValue" />.</exception>
public static int Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, int> selector)
{
if (source == null)
throw Error.ArgumentNull(nameof (source));
if (selector == null)
throw Error.ArgumentNull(nameof (selector));
int num = 0;
foreach (TSource source1 in source)
checked { num += selector(source1); }
return num;
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
только знакомлюсь с EF Core, так что не судите строгоВообщем, у меня есть такая простенькая схема моего кластера
Есть коллекция в текстовом файлеПрикрепил её к приложению и пытаюсь прочитать
[![введите сюда описание изображения][1]][1]Есть 14 вариантов матрицы, для каждого варианта нужно придумать условия по которому матрица будет...
Есть приложение, в нем обрабатываются большие данные в цикле, если цикл идет достаточно долго то приложение зависает и не обновляется его...