Func的意思<object,bool =“”>(p =&gt; true)

时间:2018-01-02 22:55:55

标签: c# delegates

我看到了这行代码:

var myFilter= val1 ? (Func<Person, bool>)(person=> true) : (person=> person.IsValid);

这部分是什么意思?:

(Func<Person, bool>)(person=> true)

然后,myFilter变量用于过滤表格中的某些数据......

return ctx.Persons.Where(myFilter).ToList(); 

val1为真并且选择条件(Func<Person, bool>)(person=> true)的第一部分时会发生什么?

3 个答案:

答案 0 :(得分:4)

Where方法采用Func<T, bool>类型的参数 - 这实际上是一个函数,它将T(在本例中为Person)作为参数,并且返回boolWhere方法为源列表中的每个对象评估此函数,并仅筛选导致true的对象。

委托person => true定义了一个方法,该方法将Person作为参数,始终返回true,而不管Person个对象。在Where子句中使用时,它将永远不会过滤掉任何内容并返回原始项集。 (由于Func<T, bool>的使用,需要转换为var - 编译器无法在没有提示的情况下确定匿名委托的类型。)

所以这段代码:

var myFilter = val1 ? (Func<Person, bool>)(person => true) : (person => person.IsValid);
return ctx.Persons.Where(myFilter).ToList();

做同样的事情:

if (val1)
{
    return ctx.Persons.ToList();
}
else
{
    return ctx.Persons.Where(person => person.IsValid).ToList();
}

答案 1 :(得分:2)

在这种情况下,传递给Where的表达式始终会返回true - 对于传递给它的任何Person

答案 2 :(得分:2)

对于要编译的条件运算符,这两个表达式需要具有相同的类型。 Lambdas有独特的类型,因此两个lambdas不具有相同的类型。通过将这些lambda中的一个(至少)转换为Func<Person, bool>,可以通过将另一个lambda隐式转换为Func类型来确定两个表达式的公共类型为Func<Person, bool>

所以myFilter现在要么总是返回true,要么val1为假,当用作Where子句时实际上会进行一些过滤。