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