对Func <>谓词表达式的困惑

1 c# lambda

我已经阅读过Func<>,它说它是一个委托,你可以使用它,例如:

Func<class,bool>
Run Code Online (Sandbox Code Playgroud)

意味着你发送一个类或任何东西,并得到一个bool结果,这就是我得到的!但以下是什么意思?

Func<Class, bool> predicate
Run Code Online (Sandbox Code Playgroud)

我不知道,你能告诉我吗?

pok*_*oke 5

前者不会编译,因为它class是一个注册的关键字,只能用于类定义.

后者是一个Func<T, TResult>函数,它接受一个类型的参数T并返回一个类型的对象TResult.所以在你的情况下,函数接受一个类型的对象Class并返回一个bool.

命名Class是不幸的,但实际上允许使用该标识符作为类型.以下是一个示例,它接受这种类型的对象,Class然后检查它的属性,返回truefalse取决于比较的成功.

Func<Class,bool> predicate = obj => obj.Prop == "Foo";

var x = new Class();
x.Prop = "Foo";

Console.WriteLine(predicate(x)); // true
Run Code Online (Sandbox Code Playgroud)
// with the following class definition
public class Class
{
    public string Prop { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

一个Func<>对象是可调用的,就像方法,所以我们可以用括号来调用它,在这里传递对象.这相当于这样的方法:

public bool predicate(Class obj)
{
    return obj.Prop == "Foo";
}
Run Code Online (Sandbox Code Playgroud)

但通常的使用方法Func<>是使用lambda表达式来快速内联创建函数.这在LINQ中非常常用,在LINQ中您使用lambda表达式,并且Func<>始终使用这些对象:

var filtered = listOfOjects.Where(obj => obj.Prop == "Foo").ToList();
//                                ^^^^^^^^^^^^^^^^^^^^^^^^
//                        this is the predicate function from above

// so you could also pass the predicate Func from above:
var filtered = listOfObjects.Where(predicate).ToList()
Run Code Online (Sandbox Code Playgroud)