我有这段代码,它应该返回一个值类型,在每一步应用 steps
中指定的转换。
private static T Transformed<T>(T x, params Func<T, T>[] steps) where T : struct
{
if ((steps?.Length ?? 0) == 0)
{
return x;
}
var reallyEmpty = steps.Where(f => (x = f(x)).Equals(int.MinValue));
return x;
}
我只需要 Where
扩展来完成每个步骤而不使用循环,因此我使用了一个可能永远不会为真的条件 (Equals(int.MinValue)
).但是,如果我有此调用代码,我会得到 5
而不是 15
,这是我所期望的。
int res1 = Transformed(5, x => x * 2, x => x + 5);
Console.WriteLine(res1);
我的问题是为什么? Where
不会遍历每个元素并检查它吗?
Where
是惰性求值的——你永远不会使用它的结果,所以谓词永远不会被求值。
您可以通过计算结果或类似方式来强制迭代:
var ignored steps.Where(f => (x = f(x)).Equals(int.MinValue)).Count();
...但是循环自己会更清楚:
foreach (var step in steps)
{
x = step(x);
}
毕竟,您并不是真的通过使用 Where
来避免循环 - 您只是隐藏了它,这样做会使您的代码过于复杂你不再理解它的程度。
我是一名优秀的程序员,十分优秀!