Where()的意外结果

Not*_*per 1 c# linq

我有这个代码,它应该返回一个值类型,在每一步应用指定的转换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;
}
Run Code Online (Sandbox Code Playgroud)

我只需要Where扩展来完成每个步骤而不使用循环,因此我使用的条件可能永远不会是真的(Equals(int.MinValue)).但如果我有这个调用代码,我会得到5而不是15,我期待的.

int res1 = Transformed(5, x => x * 2, x => x + 5);
Console.WriteLine(res1);
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么?不Where通过每个元素并检查它?

Jon*_*eet 12

该Where是懒洋洋地评估-你永远使用它的结果,所以断言永远不会被评估.

您可以通过计算结果或类似来强制迭代:

var ignored  steps.Where(f => (x = f(x)).Equals(int.MinValue)).Count();
Run Code Online (Sandbox Code Playgroud)

......但是让自己循环会更清楚:

foreach (var step in steps) 
{
    x = step(x);
}
Run Code Online (Sandbox Code Playgroud)

毕竟,你并没有真正避免使用循环Where- 你只是隐藏它,并且这样做会使你的代码过度复杂到你不再理解它的程度.