【发布时间】:2017-07-11 07:48:18
【问题描述】:
我有这段代码,它应该返回一个值类型,在每一步应用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 不是遍历每个元素并检查它吗?
【问题讨论】:
-
你没有迭代
reallyEmpty所以副作用x = f(x)永远不会执行。 -
如果你是 linq 的忠实粉丝,你可以创建 ForEach 扩展,再也不会让自己或他人感到困惑。