C#Func<&燃气轮机;问题及推广方法
我看到有人在下面写了一种Func模式。我试着用Funcs和Lambdas做实验,以得到正确的概念 因此,ExperimentalSelect返回一个Func(带有2个参数和bool返回值) 但我无法理解这3条返回语句是如何有效的(一次1条)C#Func<&燃气轮机;问题及推广方法,c#,.net,lambda,C#,.net,Lambda,我看到有人在下面写了一种Func模式。我试着用Funcs和Lambdas做实验,以得到正确的概念 因此,ExperimentalSelect返回一个Func(带有2个参数和bool返回值) 但我无法理解这3条返回语句是如何有效的(一次1条) 公共静态函数节点选择器=(x,y)=> { 返回x.值>y; }; 公共静态函数intSelector=(x,y)=> { 返回x>y; }; 公共静态函数实验选择(整数) { return nodeSelector;//看起来很简单,我同意这应该可以 //
公共静态函数节点选择器=(x,y)=>
{
返回x.值>y;
};
公共静态函数intSelector=(x,y)=>
{
返回x>y;
};
公共静态函数实验选择(整数)
{
return nodeSelector;//看起来很简单,我同意这应该可以
//这是如何工作的?intSelector是不同类型的Func
//它在这里执行,从而返回bool类型的结果
//而不是Func类型,因为此方法的返回类型应为
返回(x,y)=>intSelector(数字,数字);
//这是怎么工作的?这里的节点是什么?
//SomeMethod返回bool而不是Func类型
return(node,x)=>SomeMethod(node,number,true);
}
私有静态bool-SomeMethod(二进制树节点,int-someNumber,
bool doSomething)
{
返回node.Value
编辑:
如果ext.方法需要func
IEnumerable<int> selected = tree.TakeWhile(ExperimentalSelect);
IEnumerable selected=tree.TakeWhile(实验选择);
(node,x)=>SomeMethod(node,number,true)代码>
图中的节点或x在哪里?您在返回上的注释不正确
intSelector
和SomeMethod
未在此处执行。只有在执行ExperimentalSelect
的返回值时,才会执行它们
return (x, y) => intSelector(number, number);
这定义了一个具有两个参数的匿名方法。一个是BinaryTreeNode
类型,一个是int类型,返回值是bool,因为这就是ExperimentalSelect
的返回类型此匿名方法的主体是对intSelector
的调用,该调用仅在匿名方法本身执行时执行。这意味着,这个匿名方法的主体可以是您想要的任何内容。它甚至可以是多个语句:
return (x, y) => {
var temp;
temp = y;
y = x;
x = temp;
return intSelector(number, y);
}
然后返回匿名方法,而不是执行该方法的结果。您的返回声明等同于以下内容:
Func<BinaryTreeNode<int>, int, bool> result =
(x, y) => intSelector(number, number);
return result;
这将创建一个匿名方法,result
将指向该匿名方法。
但是,请查看以下代码:
Func<BinaryTreeNode<int>, int, bool, bool> result = SomeMethod;
public static Func<BinaryTreeNode<int>, int, bool> ExperimentalSelect (int number)
{
return (x, y) => intSelector(number, number);
}
Func<BinaryTreeNode<int>, int, bool> result = ExperimentalSelect(10);
Console.WriteLine(result(30, 20)); // writes false
它将打印false
,尽管30大于20。为什么?原因是,您的匿名方法有
x
和y
作为输入参数,但它们不在其主体中的任何位置使用。而是将number
作为两个参数传递给intSelector
。number
的值为10,10不大于10。编写此代码的正确方法如下所示:
public static Func<BinaryTreeNode<int>, int, bool> ExperimentalSelect ()
{
return (x, y) => intSelector(x, y);
}
Func<BinaryTreeNode<int>, int, bool> result = ExperimentalSelect();
Console.WriteLine(result(30, 20)); // writes true
return (BinaryTreeNode<int> x, int y) => intSelector(number,number);
公共静态函数实验选择()
{
返回(x,y)=>intSelector(x,y);
}
Func结果=实验选择();
Console.WriteLine(结果(30,20));//写对了
如您所见,我现在将
x
和y
传递给intSelector
。我还从ExperimentalSelect
中删除了参数number
,因为它不在任何地方使用。问问自己——这两行代码是否正确:
Func<BinaryTreeNode<int>, int, bool> a =
(x, y) => intSelector(number, number);
Func<BinaryTreeNode<int>, int, bool> b =
(node, x) => SomeMethod(node, number, true);
Func a=
(x,y)=>intSelector(数字,数字);
功能b=
(node,x)=>SomeMethod(node,number,true);
答案是肯定的。就像代码中的返回语句一样
我想可能是您对语法有点误解,或者可能不太理解
函数的确切含义(如果两者都不正确,请道歉)。您似乎认为在这种情况下
return (x, y) => intSelector(number, number);
返回的是intSelector(number,number)
部分。但是在现实中,return
关键字之后的所有内容都是一个返回值。您可以这样重写它:
public static Func<BinaryTreeNode<int>, int, bool> ExperimentalSelect ()
{
return (x, y) => intSelector(x, y);
}
Func<BinaryTreeNode<int>, int, bool> result = ExperimentalSelect();
Console.WriteLine(result(30, 20)); // writes true
return (BinaryTreeNode<int> x, int y) => intSelector(number,number);
return(BinaryTreeNode x,int y)=>intSelector(number,number);
这大致相当于返回一个匿名委托,该委托有两个参数类型BinaryTreeNode
和int
,返回bool类型的值。这就是你的Func
基本上,=>
左边的部分描述参数,右边的部分是方法主体,整个事物的返回类型是主体的返回类型
请看一下Eric White的文章,它对您很有意义。请参阅我答案的更新。“也许这会让事情变得更清楚一些。”丹尼尔。我看到了。有道理。你能看看我对你答案的评论吗?我明白了。这些是返回的匿名方法,对吗?还有阿格。类型假定为返回Func类型的类型。与x一样,y都是return intSelector的整数。对于某些方法,和node,x分别是BinaryNode和int。这些都是自动推断出来的。@Munish:不完全正确,但我在回答中解释错了,因为我在你的问题中忽略了这一点。x和y的类型是从ExperimentalSelect
的返回类型推断出来的。请看我答案的更新。@Daniel。是的,这就是我的意思。x和y是从这里的Func返回类型推断出来的。x和y的类型应为sourcetype1和sourcetype2@Munish:是的。在您的情况下,sourcetype1是BinaryTreeNode
,sourcetype2是int
@Munish:请参阅答案的更新。我添加了更重要的信息。