Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Func<&燃气轮机;问题及推广方法_C#_.net_Lambda - Fatal编程技术网

C#Func<&燃气轮机;问题及推广方法

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;//看起来很简单,我同意这应该可以 //

我看到有人在下面写了一种Func模式。我试着用Funcs和Lambdas做实验,以得到正确的概念

因此,ExperimentalSelect返回一个Func(带有2个参数和bool返回值)

但我无法理解这3条返回语句是如何有效的(一次1条)

公共静态函数节点选择器=(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(实验选择);
  • 这里的SomeMethod是如何工作的?它不是Func

  • 这个语法是什么意思:
    (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:请参阅答案的更新。我添加了更重要的信息。