C# 对函数的混淆<&燃气轮机;谓词表达式

C# 对函数的混淆<&燃气轮机;谓词表达式,c#,lambda,C#,Lambda,我读过关于Func,上面说它是一个委托,你可以像这样使用它,例如: Func<class,bool> Func 意思是你发了一个类或任何东西,得到一个bool结果,这就是我得到的! 但是下面的意思是什么 Func<Class, bool> predicate Func谓词 我不知道,你能给我讲清楚吗?前者不会编译,因为class是一个注册关键字,只能使用 后者是一个函数,它接受T类型的参数并返回TResult类型的对象。因此,在您的例子中,函数接受类型为Class

我读过关于
Func
,上面说它是一个委托,你可以像这样使用它,例如:

Func<class,bool>
Func
意思是你发了一个类或任何东西,得到一个bool结果,这就是我得到的! 但是下面的意思是什么

Func<Class, bool> predicate
Func谓词

我不知道,你能给我讲清楚吗?

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

后者是一个函数,它接受
T
类型的参数并返回
TResult
类型的对象。因此,在您的例子中,函数接受类型为
Class
的对象并返回
bool

类的命名是不幸的,但实际上允许它将该标识符用于类型。下面是一个示例,它获取类型为
Class
的对象,然后检查其属性,根据比较的成功程度返回
true
false

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

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

Console.WriteLine(predicate(x)); // true
一个
Func
对象是可调用的,就像方法一样,所以我们可以使用括号来调用它并将对象传递到这里。这相当于这样一种方法:

public bool predicate(Class obj)
{
    return obj.Prop == "Foo";
}
Func<string, bool> isLongerThanThree = input => input.Length > 3;
isLongerThanThree("string"); // Returns "true"
但是通常使用
Func
的方法是能够快速内联创建函数。这在使用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()

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

后者是一个函数,它接受
T
类型的参数并返回
TResult
类型的对象。因此,在您的例子中,函数接受类型为
Class
的对象并返回
bool

类的命名是不幸的,但实际上允许它将该标识符用于类型。下面是一个示例,它获取类型为
Class
的对象,然后检查其属性,根据比较的成功程度返回
true
false

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

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

Console.WriteLine(predicate(x)); // true
一个
Func
对象是可调用的,就像方法一样,所以我们可以使用括号来调用它并将对象传递到这里。这相当于这样一种方法:

public bool predicate(Class obj)
{
    return obj.Prop == "Foo";
}
Func<string, bool> isLongerThanThree = input => input.Length > 3;
isLongerThanThree("string"); // Returns "true"
但是通常使用
Func
的方法是能够快速内联创建函数。这在使用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()

这就是实例化
Func
的方法。与字符串比较:

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

public bool predicate(Class obj)
{
    return obj.Prop == "Foo";
}
Func<string, bool> isLongerThanThree = input => input.Length > 3;
isLongerThanThree("string"); // Returns "true"
Func islongerthantere=input=>input.Length>3;
Islongerthantere(“字符串”);//返回“true”

这正是实例化
函数的方式。与字符串比较:

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

public bool predicate(Class obj)
{
    return obj.Prop == "Foo";
}
Func<string, bool> isLongerThanThree = input => input.Length > 3;
isLongerThanThree("string"); // Returns "true"
Func islongerthantere=input=>input.Length>3;
Islongerthantere(“字符串”);//返回“true”
Func
是一种委托类型

Func谓词
中,谓词是委托变量

你通常会看到

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

if (predicate(myClass1))  DoSomething();
Func谓词=c=>c.IsValid;
...
if(谓词(myClass1))DoSomething();
Func
是一种委托类型

Func谓词
中,谓词是委托变量

你通常会看到

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

if (predicate(myClass1))  DoSomething();
Func谓词=c=>c.IsValid;
...
if(谓词(myClass1))DoSomething();

您指的是单词
谓词吗

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

  • MyMethod(int-myAge)
  • MyMethod(列出myBooleans)
  • MyMethod(Func-myPredicate)

还要注意以下内容之间的相似性:

int myAge = 30;
myAge
是一个类型为
int
的变量,其值为
30

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

myPredicate
是一个类型为
Func
的变量,该变量的值为
(x=>x.IsAlive)

您指的是
predicate
这个词吗

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

  • MyMethod(int-myAge)
  • MyMethod(列出myBooleans)
  • MyMethod(Func-myPredicate)

还要注意以下内容之间的相似性:

int myAge = 30;
myAge
是一个类型为
int
的变量,其值为
30

Func<Class,bool> myPredicate = (x => x.IsAlive);
Func myPredicate=(x=>x.IsAlive);
myPredicate
是一个类型为
Func
的变量,它被赋予
(x=>x.IsAlive)
Func
的值,它是一个代表返回结果的方法的委托。C#为最多15个输入参数提供签名,这些参数应足以表示您将需要的所有可能方法:) 很难想象有15个输入参数的方法。除了
Func
之外,还有一些特殊版本的委托,如
谓词
,它不是表示没有返回值的函数的
Func
Action
,返回值是
void

您可以将任何具有匹配签名的方法、静态方法、实例方法甚至匿名方法分配给
Func
。例如:

Func<class,bool>
Func谓词=(myClass)=>{return true;}//anonymousys方法

public class MyClass
{
    public bool MyPredicate(MyClass myClass)
    {
        return true;
    }

    public static bool MyStaticPredicate(MyClass myClass)
    {
        return true;
    }
}

Func<MyClass, bool> predicate = new MyClass().MyPredicate;
Func<MyClass, bool> staticPredicate = MyClass.MyStaticPredicate;
公共类MyClass
{
公共布尔MyPredicate(MyClass MyClass)
{
返回true;
}
公共静态bool MyStaticPredicate(MyClass MyClass)
{
返回true;
}
}
Func predicate=new MyClass().MyPredicate;
Func staticPredicate=MyClass.MyStaticPredicate;
Fu