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说的那样,使用查询理解语法可能会更好.它更简洁,更容易在精神上解析查询的工作方式.