首页 > 解决方案 > LINQ 执行流程(作业)

问题描述

我不明白以下代码中的执行顺序。这里满足第一个Where子句的数字是 (4, 10, 3, 7),满足第二个Where子句的数字是 2 和 1,然后我们有函数Aggregate将它们相减并从两者中生成一个元素。

我的问题是这里的执行流程是什么 - (1)Where以 c/3 > 0 对所有元素执行,然后 (2)Where或 (1) 第一个子句对一个元素执行并将其传递给 (2)并从那里聚合 - 当我打印值时,我无法使用两种方法在纸上将 x 的值设为 28,我也无法调试 linq 语句。感谢您提前提供任何帮助。

var ints = new int[] { 2, 4, 1, 10, 3, 7 };

var x = ints
    .Where(c => c / 3 > 0)               <-- (1)
    .Select(s2 => s2 + ints
        .Where(c => c / 3 == 0)          <-- (2)
        .Aggregate((f, s) => f - s))     
    .Sum();

标签: c#linq

解决方案


同样的语句可以写成如下:

var ints = new int[] { 2, 4, 1, 10, 3, 7 };

var x = ints
    .Where(c =>
        {
            Console.WriteLine($"1 Where for number: {c}");
            return c / 3 > 0;
        }) //< --(1)
    .Select(s2 => s2 + ints
        .Where(c =>
        {
            Console.WriteLine($"2 Where for number: {c}");
            return c / 3 == 0;
        }) // < --(2)
        .Aggregate((f, s) =>
        {
            Console.WriteLine($"Aggregate: f: {f} s: {s}");
            return f - s;
        }))
    .Sum();

在这种情况下,每个速记 lambda 表达式都可以写成带有方法体的完整匿名方法。你只需要使用{ .. }括号。在它们里面你可以写多个语句。如果您查看文档的Where您可以看到它期望(在您的情况下) aFunc<int, bool>作为输入参数。这意味着您传递一个int内部并返回一个bool。这就是为什么你需要像我一样编写显式的 return 语句:return c / 3 > 0;

如果您现在将调试输出插入控制台,您将获得书面证明并深入了解整个代码隔间的执行情况。

结果输出如下所示:

1 Where for number: 2 1 Where for number: 4 2 Where for number: 2 2 Where for number: 4 2 Where for number: 1 Aggregate: f: 2 s: 1 2 Where for number: 10 2 Where for number: 3 2 Where for number: 7 1 Where for number: 1 1 Where for number: 10 2 Where for number: 2 2 Where for number: 4 2 Where for number: 1 Aggregate: f: 2 s: 1 2 Where for number: 10 2 Where for number: 3 2 Where for number: 7 1 Where for number: 3 2 Where for number: 2 2 Where for number: 4 2 Where for number: 1 Aggregate: f: 2 s: 1 2 Where for number: 10 .... ....


推荐阅读