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();
解决方案
同样的语句可以写成如下:
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 .... ....
推荐阅读
- emacs - 这个 Elisp (Emacs Lisp) 语句中的序列关键字究竟做了什么?
- sql - SQL Server 全文包含在某些单词中不起作用
- javascript - 状态超时后的组件路由器
- docker - 在 Window 和 WSL 之间共享 docker 凭据
- java - 为什么我的横幅没有出现在 Linearlayout 中?
- javascript - 购物车数组未正确呈现,react.js
- javascript - 如何在 Angular 中获取文件哈希名称?
- sql-server - SQL Server SELECT * INTO 临时表是否保留确切的列数据类型?
- grails - 输入列表的 Grails 命令对象验证
- graph-databases - Amazon Neptune - 不等于谓词在使用 bothE() 时不适用于边缘标签