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

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_1和c_2的值,那么我们只能使用query2实现此功能,但不能使用query1实现:

  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)始终是冗余的.它只是意味着“对于序列中的每个元素,选择元素”.

第二个片段当然是不同的,SelectMany和Select语句确实需要嵌套才能选择所有三个元素c_1,c_2和c_3.

但是,就像Gert说的那样,使用查询理解语法可能会更好.它更简洁,更容易在精神上解析查询的工作方式.

点赞