Подтвердить что ты не робот

Как работает выражение Lambda

в интервью, интервьюер задал мне следующий запрос

int[] array = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Func<int, int> func = i =>
{
    Console.Write(array[i]);
    return i;
};

var result = array.Where(e => e <= func(2)).ToArray();

так будет ли кто-нибудь подсказывать мне, как работает e <= func(2)? и как последняя строка i.e

var result = array.Where(e => e <= func(2)).ToArray();

работы?

4b9b3361

Ответ 1

Это может быть проще понять, если вы используете круглые скобки:

var result = array.Where(e => (e <= func(2))).ToArray();

Это

e => ...

Создает функцию, которая принимает один аргумент.

Это

e <= func(2)

сравнивает e с func(2). func(2) вызывает функцию func с аргументом 2.

В целом, <= не имеет ничего общего с =>. Это два совершенно разных оператора. Суммирование ... => ... создает функцию. ... <= ... сравнивает аргументы.

Ответ 2

Func<int, int> означает, что func - это функция с одним параметром типа int и результатом типа int. Параметр i является параметром. Функция записывает элемент массива в консоль и возвращает параметр немодифицированный.

Функция Where возвращает все случаи, соответствующие указанному предикату, ToArray делает массив из IEnumerable, возвращаемый Where (читаем о linq). e => e <= func(2) - это функция с одним параметром типа int (аналогично типу коллекции) и с результатом типа bool. Вы можете записать его как обычную функцию:

bool Foo(int e) {
    return e <= func(2);
}

И поскольку func возвращает немодифицированный параметр, он функционально равен

bool Foo(int e) {
    return e <= 2;
}

но не учитывая побочный эффект.

Ответ 3

Если вы посмотрите на возможные комбинации = и < или > в С#:

  • <= - это оператор "меньше или равно"
  • >= - оператор "больше или равно"
  • => - это лямбда-оператор, слева - параметры лямбда, справа - тело
  • =< недействителен, такого оператора

Ответ 4

Это означает, что для всех e, где e меньше или равно, тогда func (2). Вызов ToArray() приводит к оценке выражения LINQ, поэтому 3333333333 печатается на консоли

Ответ 5

Where() представляет собой запрос LINQ, который фильтрует массив на основе теста, содержащегося в его параметре выражения лямбда.

e => e <= func(2), является выражением лямбда, которое передается в запрос Where(), чтобы принимать каждый элемент в array и добавлять этот элемент к result, если значение меньше или равно ( " < =" ) func (2).

ToArray() - это оператор преобразования, который действует как литье из IEnumerable в массив.

Подробнее о LINQ см. здесь.