我想了解如何处理链查询。例如,让我们考虑以下查询
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什么也不做,只是返回的输出IEnum1是true
IEnum2什么也不做,只是返回的输出IEnum2是true
4.Calling Current(向后传)
.Sum()电话Current上IEnum3。
IEnum3电话Current上IEnum2
IEnum2电话Current上IEnum1
IEnum1电话Current上IEnum0
5. 回流(正向传递)
IEnum0 回报 4
IEnum1 回报 4
IEnum2 回报 sqrt(4)=2
IEnum3 回报 exp(2)
6. 重复步骤 2.-5。直到第 3 步。返回 false
如果链式查询的处理方式不同,请纠正我。
叮当猫咪
相关分类