对Func<>的困惑谓词表达

时间:2018-02-16 08:32:04

标签: c# lambda

我已经阅读过关于Func<>的信息,它说它是一个代理人,您可以像使用它一样使用它:

Func<class,bool>

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

Func<Class, bool> predicate

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

5 个答案:

答案 0 :(得分:5)

前者不会编译,因为class是注册关键字,只能使用for class definitions

后者是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
// with the following class definition
public class Class
{
    public string Prop { get; set; }
}

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

public bool predicate(Class obj)
{
    return obj.Prop == "Foo";
}

但使用Func<>的常用方法是使用lambda expressions能够快速内联创建函数。这在LINQ中非常常用,你在{{3}}中使用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()

答案 1 :(得分:1)

这就是你如何实例化Func。与字符串比较:

string str;

如果要同时实例化并分配它,可以执行以下操作:

Func<string, bool> isLongerThanThree = input => input.Length > 3;
isLongerThanThree("string"); // Returns "true"

答案 2 :(得分:1)

Func<MyClass,bool>是委托类型

Func<MyClass, bool> predicate中,谓词是委托变量

您通常会看到类似

的内容
Func<MyClass, bool> predicate = c => c.IsValid;
...

if (predicate(myClass1))  DoSomething();

答案 3 :(得分:1)

您指的是predicate这个词吗?

这只是参数的名称。请注意相似之处:

  • MyMethod(int myAge)
  • MyMethod(List<bool> myBooleans)
  • MyMethod(Func<Class,bool> myPredicate)

还要注意以下几点之间的相似之处:

int myAge = 30;

myAgeint类型的变量,其值为30

Func<Class,bool> myPredicate = (x => x.IsAlive);

myPredicateFunc<Class,bool>类型的变量,其值为(x => x.IsAlive)

答案 4 :(得分:1)

Func<>是一个委托,表示返回结果的方法。 C#提供最多15个输入参数的签名,这应足以代表您将需要的所有可能方法:) 想象有15个输入参数的方法几乎不是事件。在Func<>旁边还有一些特殊版本的委托,例如Predicate<T>Func<in T, bool TResult>Action<>代表没有返回值的函数,返回值为{{ 1}}。

Delegates(C# Programming Guide)

您可以将匹配签名的任何方法,静态或实例甚至匿名分配给void。例如:

Func<>

Func<MyClass, bool> predicate = (myClass) => {return true;} //anonymoys method