我遇到了一个奇怪的问题,我想知道我应该做什么.
我有这个类返回一个IEnumerable< MyClass>这是延期执行.现在有两个可能的消费者.其中一个排序结果.
请参见以下示例:
public class SomeClass
{
public IEnumerable GetMyStuff(Param givenParam)
{
double culmulativeSum = 0;
return myStuff.Where(...)
.OrderBy(...)
.TakeWhile( o =>
{
bool returnValue = culmulativeSum < givenParam.Maximum;
culmulativeSum += o.SomeNumericValue;
return returnValue;
};
}
}
消费者称延迟执行只有一次,但是如果它们被称为更多的结果,结果将是错误的,因为culmulativeSum不会被重置.我通过无意识的单元测试发现了这个问题.
解决这个问题的最简单的方法是添加.ToArray(),并以一点点开销为代价去除延迟执行.
我也可以在消费者阶层添加单元测试,以确保他们只将它们称为一次,但这并不会阻止任何新的消费者在未来从这个潜在的问题编码.
我想到的另一件事是让后续执行.
就像是
return myStuff.Where(...)
.OrderBy(...)
.TakeWhile(...)
.ThrowIfExecutedMoreThan(1);