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
and 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);
Update: x => x
是恒等映射,所以Select(x => x)
无论上下文如何,总是多余的。它只是意味着“对于序列中的每个元素,选择该元素”。
第二个片段当然是不同的,并且SelectMany
and Select
语句确实需要嵌套才能选择所有三个元素,c_1
, c_2
, and c_3
.
不过,就像格特所说,你最好使用查询理解语法。它更加简洁,并且更容易在头脑中解析查询的工作原理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)