Как работает лямбда-выражение - PullRequest
20 голосов
/ 15 января 2012

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

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)? и как последняя строка, т. е.

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

работает

Ответы [ 5 ]

7 голосов
/ 15 января 2012

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

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

This

e => ...

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

e <= func(2)

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

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

4 голосов
/ 15 января 2012

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

  • <= - это оператор «меньше или равно»
  • >= - это оператор «больше или равно»
  • => - это лямбда-оператор, слева - параметры лямбды, справа - тело
  • =< недопустим, такого оператора нет
4 голосов
/ 15 января 2012

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;
}

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

2 голосов
/ 15 января 2012

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

1 голос
/ 15 января 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...