【发布时间】:2019-05-16 07:45:22
【问题描述】:
我不明白以下代码中的执行顺序。这里满足第一个 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();
【问题讨论】:
-
“我无法调试 linq 语句” - 是的,你可以。如果断点难以遵循,您可以将 lambdas (
c => ...) 制作成代码块 (c => { ... }) 并添加调试输出 (Debug.WriteLine)。 -
@Sinatr 它不允许我把 { } 括号放在你说的地方......顺便说一句,它不难理解它只是一步执行,或者它允许我只在选择上放置断点以及它没有帮助的变量。
-
@BorisBorovski 来自@Sinatr 的括号如
c => {…}应写为c => { return …} -
@Rafalon 谢谢。但是我仍然没有在第一步(1)第 4 步中得到它,在第二步(2)第 2 步中,因为 2/3 == 0 并且聚合必须执行 4 - 2 但我的逻辑不正确,你能解释一下吗.
-
@BorisBorovski Second 选择 2 和 1,然后对这两个执行聚合:2-1 = 1(请查看下面的答案)