LINQ执行流程(作业)

Bor*_*ski 5 c# 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();
Run Code Online (Sandbox Code Playgroud)

Mon*_*Zhu 6

相同的语句可以编写如下:

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();
Run Code Online (Sandbox Code Playgroud)

在这种情况下,每个速记lambda表达式都可以编写为带有方法主体的完整匿名方法。您只需要使用{ .. }括号即可。在其中可以编写多个语句。如果查看文档中的“可以在哪里看到”(在您的情况下)期望Func<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 .... ....