我想了解如何处理链查询。例如,让我们考虑以下查询
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. 获取所有枚举器(正向传递)
numbers
GetEnumerator()
返回(让我们用它表示)IEnum0
实例的调用
IEnum0
GetEnumerator()
返回IEnum1
实例的调用
IEnum1
GetEnumerator()
返回IEnum2
实例的调用
IEnum2
GetEnumerator()
返回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
如果链式查询的处理方式不同,请纠正我。
叮当猫咪
相关分类