为了账号安全,请及时绑定邮箱和手机立即绑定

Linq:执行链查询的顺序

Linq:执行链查询的顺序

C#
狐的传说 2021-11-21 15:22:29
我想了解如何处理链查询。例如,让我们考虑以下查询var sumOfRoots = numbers           //IEnum0      .Where(x => x > 0)            //IEnum1      .Select(x => Math.Sqrt(x))    //IEnum2      .Select(x => Math.Exp(x))     //IEnum3      .Sum();哪里例如 numbers={-1, 4, 9 }.这是幕后发生的事情吗:1. 获取所有枚举器(正向传递)numbersGetEnumerator()返回(让我们用它表示)IEnum0实例的调用IEnum0GetEnumerator()返回IEnum1实例的调用IEnum1GetEnumerator()返回IEnum2实例的调用IEnum2GetEnumerator()返回IEnum3实例的调用2.调用MoveNext(向后传递).Sum()电话MoveNext()上IEnum3IEnum3电话MoveNext()上IEnum2IEnum2电话MoveNext()上IEnum1IEnum1电话MoveNext()上IEnum03. 从 MoveNext 返回(前后传)IEnum0移动到 element-1并返回true。IEnum1检查是否-1满足条件(这是不正确的),所以IEnum1电话MoveNext()上IEnum0。IEnum0移动到 element4并返回true。IEnum1检查是否4满足条件(这是真的)并返回trueIEnum2什么也不做,只是返回的输出IEnum1是trueIEnum2什么也不做,只是返回的输出IEnum2是true4.Calling Current(向后传).Sum()电话Current上IEnum3。IEnum3电话Current上IEnum2IEnum2电话Current上IEnum1IEnum1电话Current上IEnum05. 回流(正向传递)IEnum0 回报 4IEnum1 回报 4IEnum2 回报 sqrt(4)=2IEnum3 回报 exp(2)6. 重复步骤 2.-5。直到第 3 步。返回 false如果链式查询的处理方式不同,请纠正我。
查看完整描述

1 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

您可以使用委托来了解执行顺序。例子:


static void Main(string[] args)

{

    var numbers = new []{ -1, 4, 9 };


    double sumOfRoots = numbers.Where(IsGreaterThanZero)   

                               .Select(ToSquareRoot)      

                               .Select(ToExp)              

                               .Sum(x => ToNumber(x));


    Console.WriteLine($"sumOfRoots = {sumOfRoots}");


    Console.Read();

}


private static double ToNumber(double number)

{

    Console.WriteLine($"SumNumber({number})");


    return number;

}


private static double ToSquareRoot(int number)

{

    double value =  Math.Sqrt(number);


    Console.WriteLine($"Math.Sqrt({number}): {value}");


    return value;

}


private static double ToExp(double number)

{

    double value =  Math.Exp(number);


    Console.WriteLine($"Math.Exp({number}): {value}");


    return value;

}


private static bool IsGreaterThanZero(int number)

{

    bool isGreater = number > 0;


    Console.WriteLine($"{number} > 0: {isGreater}");


    return isGreater;

}

输出:


-1 > 0:错误


4 > 0:真


Math.Sqrt(4): 2


Math.Exp(2): 7.38905609893065


SumNumber(7.38905609893065)


9 > 0:真


Math.Sqrt(9): 3


Math.Exp(3): 20.0855369231877


SumNumber(20.0855369231877)


sumOfRoots = 27.4745930221183


查看完整回答
反对 回复 2021-11-21
  • 1 回答
  • 0 关注
  • 150 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信