C# Lambda两种写法是否功能等价?TreeCollections包相关语法疑问
语法解释
你看到的dataNode => new Category(dataNode.Id, dataNode.Name)是C#的Lambda表达式,本质是一个匿名函数/委托,这里是作为Build方法的参数传入的,作用是告诉Build方法:遍历到每一个原始数据节点的时候,应该用什么规则把它转换成你自定义的Category实体对象。
你觉得缺少闭合括号属于误解,这段语法是完整的:Build方法接收两个参数,第一个是数据源根节点dataRoot,第二个就是这个定义转换规则的Lambda表达式,括号闭合逻辑正确。
和你给出的第二种写法的差异
二者功能完全不一致,第二种写法本身就是错误的,原因如下:
- 你写的
var dataNode = new Category(dataNode.Id, dataNode.Name)会直接报错,此时dataNode还没有完成声明就被拿来取值,属于未定义变量引用 - 第二种写法是仅创建1个固定的
Category对象传给Build,但Lambda的写法是把「转换逻辑」传给Build,Build内部会遍历树形数据源的所有层级节点,对每一个节点都执行一次这个转换逻辑,生成对应层级的Category对象,最终才能构建出完整的实体树结构。
运行逻辑
整行root.Build(dataRoot, dataNode => new Category(dataNode.Id, dataNode.Name))的执行流程是:
Build方法首先拿到你传入的数据源根对象dataRoot- 按层级遍历
dataRoot下的所有子节点,每获取到一个数据节点,就把这个节点作为参数传入你定义的Lambda表达式 - Lambda执行后返回对应转换完成的
Category对象,Build方法会把这些生成的Category对象按照原来数据源的层级关系,挂载到root对应的节点位置,最终完成整个实体树的构建。
内容的提问来源于stack exchange,提问作者Eric Snyder
相关产品推荐
相关产品推荐

