c# - 这两个 LINQ 查询可以互换使用吗?

标签 c# linq linq-to-objects

a) 以下两个查询会产生相同的结果吗:

  var query1 = collection_1
            .SelectMany(c_1 => c_1.collection_2)
            .SelectMany(c_2 => c_2.collection_3)
            .Select(c_3 => c_3);

  var query2 = collection_1
            .SelectMany(c_1 => c_1.collection_2
            .SelectMany(c_2 => c_2.collection_3.Select(c_3 => c_3)));

b) 我假设这两个查询不能总是互换使用?例如,如果我们希望输出元素也包含 c_1c_2 的值,那么我们只能使用 query2 来实现,而不是查询1:

  var query2 = collection_1
            .SelectMany(c_1 => c_1.collection_2
            .SelectMany(c_2 => c_2.collection_3.Select(c_3 => new { c_1, c_2, c_3 } )));

?

谢谢

最佳答案

您提供的片段似乎无效。 c_3 没有在 Select 语句的范围内定义,所以除非我误解了什么,否则它不会编译。

似乎您正在尝试选择 collection_3 的元素,但这是由 SelectMany 隐式完成的,因此最后的 Select 两种情况下的语句都是多余的。去掉它们,两个查询是等价的。

你只需要这个:

var query = collection_1
           .SelectMany(c_1 => c_1.collection_2)
           .SelectMany(c_2 => c_2.collection_3);

更新:x => x是恒等映射,所以Select(x => x)总是多余的,不管语境。它只是意味着“对于序列中的每个元素,选择该元素”。

第二个片段当然不同,SelectManySelect 语句确实需要嵌套才能选择所有三个元素,c_1c_2c_3

不过,正如 Gert 所说,您最好还是使用查询理解语法。它更简洁,更容易在脑海中解析查询的工作原理。

关于c# - 这两个 LINQ 查询可以互换使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13017642/

相关文章:

c# - 具有依赖注入(inject)的 Entity Framework Core 是如何处理的?

c# - 动态 WPF MVVM 数据网格行为

c# - Entity Framework 4.1 修改对象和子集合

c# - 我可以在 Linq 结果上使用 "Count"属性吗?

c# - 扩展方法(如 Take())不适用于 LINQ 查询,有什么原因吗?

c# - 使用 linq 更新对象的性能更好

c# - WPF Prism Bound 字段值在命令触发之前不可用

c# - 使用 await 时 SynchronizationContext 不流动

.net - 如何使用连接 PLINQ 现有的 LINQ 查询?

c# - 在实现 LINQ 后,IntelliSense 不给我选择属性的选项