0

在下面的示例中,特别是在函数的第二条语句中,传递给 lambda 函数的“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);
}
4

3 回答 3

5

从文档http://msdn.microsoft.com/en-us/library/fh1w7y8z.aspx

Predicate 是一个方法的委托,如果传递给它的对象与委托中定义的条件匹配,则该方法返回 true。当前 List 的元素单独传递给 Predicate 委托,符合条件的元素保存在返回的 List 中。

因此n是 的一个元素numbers

于 2013-10-15T18:22:42.847 回答
0

您可以从以下签名中获得FindAll

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

Predicate<T>在哪里

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

所以FindAll接受一个带有T输入的函数(在本例中为 an int)并返回 a bool。的文档FindAll告诉您列表中的每个项目都传递给函数。

于 2013-10-15T18:25:53.267 回答
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;
}

所以lambda 表达式中的变量和这个方法n中的变量是一样的。item

于 2013-10-15T18:26:32.240 回答