Linq Moq First()Last()和GetEnumerator()wierdness

Linq Moq First()Last()和GetEnumerator()wierdness,linq,moq,enumerable,Linq,Moq,Enumerable,我是莫清,我的路线是从一个 rps=新列表。。。(3个布线部件) 和Moqing GetEnumerator()用于我的路线,如下所示 route.Setup(ro=>ro.GetEnumerator()).Returns(rps.GetEnumerator()) 但是Moq在调用Last() 查看即时窗口中的First()。这就好像调用了MoveNext(),但没有调用Reset(),可枚举项完全混淆了。有没有人在Moq中遇到过这种情况并找到了解决方案?您已经设置了GetEnumerator,

我是莫清,我的路线是从一个
rps=新列表。。。(3个布线部件)

Moqing GetEnumerator()
用于我的路线,如下所示

route.Setup(ro=>ro.GetEnumerator()).Returns(rps.GetEnumerator())

但是
Moq
在调用
Last()


查看即时窗口中的
First()。这就好像调用了
MoveNext()
,但没有调用
Reset()
,可枚举项完全混淆了。有没有人在
Moq
中遇到过这种情况并找到了解决方案?

您已经设置了GetEnumerator,以便它每次都返回相同的枚举器实例

route.Setup(ro => ro.GetEnumerator()).Returns(rps.GetEnumerator());
这相当于:

var enumerator = rps.GetEnumerator()
route.Setup(ro => ro.GetEnumerator()).Returns(enumerator);
如果每次调用都需要一个新的枚举数,则需要传递并返回一个lambda表达式:

route.Setup(ro => ro.GetEnumerator()).Returns(() => rps.GetEnumerator());

每次调用GetEnumerator()时都会调用lambda-因此
First()
Last()
应该会按预期工作。

感谢您的解决方案:-)您的回答让我思考了如何使用枚举器。表达式解析器会将First()和Last()作为constant进行计算,还是会在路由的每个RoutePart上重新计算它们?是-每次都重新计算,直到找到第一个匹配项(此时
Any
可以返回)我无法使这一点起作用:我得到的错误是-非虚拟上的设置无效(在VB中可重写)member:x=>x.GetEnumerator()可能最适合作为一个新(VB?)问题提问
route.Setup(ro => ro.GetEnumerator()).Returns(() => rps.GetEnumerator());