Как работают лямбда-функции?

103
12 февраля 2022, 01:10

Пытаюсь разобраться в том, как работают лямбда-функции и увидел на метаните, как он проделывает следующее:

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, но не понимаю, что это за конструкция, почему нет тела, где прописан непосредственно алгоритм метода?

Подскажите, пожалуйста, как можно найти похожие конструкции или что-то еще, чтобы понять, как это работает

Answer 1

По первой части вопроса: да, правильно понимаете.

Исторически, сначала в 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;
}
READ ALSO
Как получить связанные сущности в одной в Entity Framework Core?

Как получить связанные сущности в одной в Entity Framework Core?

только знакомлюсь с EF Core, так что не судите строгоВообщем, у меня есть такая простенькая схема моего кластера

112
Xamarin чтение внедренного текстового файла

Xamarin чтение внедренного текстового файла

Есть коллекция в текстовом файлеПрикрепил её к приложению и пытаюсь прочитать

131
C#, Условия заполнения матриц

C#, Условия заполнения матриц

[![введите сюда описание изображения][1]][1]Есть 14 вариантов матрицы, для каждого варианта нужно придумать условия по которому матрица будет...

88
Работа windows form

Работа windows form

Есть приложение, в нем обрабатываются большие данные в цикле, если цикл идет достаточно долго то приложение зависает и не обновляется его...

155