Linq:执行链查询的顺序

我想了解如何处理链查询。例如,让我们考虑以下查询

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()IEnum3

  • IEnum3电话MoveNext()IEnum2

  • IEnum2电话MoveNext()IEnum1

  • IEnum1电话MoveNext()IEnum0

3. 从 MoveNext 返回(前后传)

  • IEnum0移动到 element-1并返回true

  • IEnum1检查是否-1满足条件(这是不正确的),所以IEnum1电话MoveNext()IEnum0

  • IEnum0移动到 element4并返回true

  • IEnum1检查是否4满足条件(这是真的)并返回true

  • IEnum2什么也不做,只是返回的输出IEnum1true

  • IEnum2什么也不做,只是返回的输出IEnum2true

4.Calling Current(向后传)

  • .Sum()电话CurrentIEnum3

  • IEnum3电话CurrentIEnum2

  • IEnum2电话CurrentIEnum1

  • IEnum1电话CurrentIEnum0

5. 回流(正向传递)

  • IEnum0 回报 4

  • IEnum1 回报 4

  • IEnum2 回报 sqrt(4)=2

  • IEnum3 回报 exp(2)

6. 重复步骤 2.-5。直到第 3 步。返回 false

如果链式查询的处理方式不同,请纠正我。


狐的传说
浏览 151回答 1
1回答

叮当猫咪

您可以使用委托来了解执行顺序。例子: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): 2Math.Exp(2): 7.38905609893065SumNumber(7.38905609893065)9 > 0:真Math.Sqrt(9): 3Math.Exp(3): 20.0855369231877SumNumber(20.0855369231877)sumOfRoots = 27.4745930221183
打开App,查看更多内容
随时随地看视频慕课网APP