2013-10-15 2 views
0

В моем примере ниже, во втором выражении функции конкретно, что такое параметр 'n' передается в функцию лямбда. В контексте кода я предполагаю, что это указывает на список чисел. Но как я могу узнать это окончательно, вместо того, чтобы угадывать из контекста кода.Как определяется параметр в лямбда-функции?

//simple example of lambda expression. 
public static void SimpleLambdExpression() 
{ 
    List<int> numbers = new List<int>{1,2,3,4,5,6,7}; 
    var evens = numbers.FindAll(n => n % 2 == 0); 
    var evens2 = numbers.FindAll((int n) => { return n % 2 == 0; }); 
    ObjectDumper.Write(evens); 
    ObjectDumper.Write(evens2); 
} 
+5

Это полностью зависит от того, что вызывает лямбда. Вам необходимо прочитать документацию или исходный код. – SLaks

+0

Он представляет текущий элемент итерации. – Shimrod

+0

Я предлагаю вам использовать методы расширения LINQ вместо 'List ', чтобы вы не привязывались к конкретной реализации ('List '). По большей части существуют прямые аналоги, например. 'FindAll' подобен' Where'. –

ответ

5

Из документации http://msdn.microsoft.com/en-us/library/fh1w7y8z.aspx:

сказуемое делегат метода, который возвращает истину, если объект, переданный ему соответствует условиям, определенным в делегатом. Элементы текущего списка индивидуально передаются делегату Predicate, , и элементы, соответствующие условиям, сохраняются в списке .

Следовательно n является элементом numbers.

0

Вы получаете, что с момента подписания FindAll:

public List<T> FindAll(
    Predicate<T> match 
) 

где Predicate<T> является

public delegate bool Predicate<in T>(
    T obj 
) 

Так FindAll принимает функцию с T входом (в данном случае int) и возвращает bool , В документации для FindAll указано, что каждый элемент в списке передается функции.

0

FindAll метод расширения можно записать следующим образом (если это поможет вам понять):

IEnumerable<int> FindAll(IEnumerable<int> source, Predicate<int> predicate) 
{ 
    List<int> result = new List<int>(); 
    foreach (int item in source) 
    { 
     if (predicate(item)) 
     { 
      result.Add(item); 
     } 
    } 

    return result; 
} 

Так n переменной в лямбда-выражения является такой же, как item переменной в этом методе.

Смежные вопросы