Как работает выражение 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();
работы?
Ответы
Ответ 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 см. здесь.