我希望了解链式查询的处理方式。例如,我们考虑以下查询:
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()
在IEnum3
上调用MoveNext()
IEnum3
在IEnum2
上调用MoveNext()
IEnum2
在IEnum1
上调用MoveNext()
IEnum1
在IEnum0
上调用MoveNext()
3. 从 MoveNext 返回(向前-向后遍历)
IEnum0
移动到元素-1
并返回true
。IEnum1
检查是否满足条件(这是不正确的),因此IEnum1
在IEnum0
上调用MoveNext()
。IEnum0
移动到元素4
并返回true
。IEnum1
检查是否满足条件(这是正确的)并返回true
IEnum2
什么也不做,只返回IEnum1
的输出,即true
IEnum2
什么也不做,只返回IEnum2
的输出,即true
4. 调用 Current(向后遍历)
.Sum()
调用IEnum3
上的Current
。IEnum3
调用IEnum2
上的Current
IEnum2
调用IEnum1
上的Current
IEnum1
调用IEnum0
上的Current
5. 返回 Current (正向传递)
IEnum0
返回4
IEnum1
返回4
IEnum2
返回sqrt(4)=2
IEnum3
返回exp(2)
6. 重复步骤2-5,直到步骤3返回false
如果链式查询有不同的处理方式,请纠正我。