有谁知道为什么这两个查询的结果类型不同?
// q1 is IOrderedEnumerable<int>
var q1 = from c1 in new[] { 1, 2, 3 }
orderby c1
select c1;
// q2 is IEnumerable<int>
var q2 = from c1 in new[] { 1, 2, 3 }
from c2 in new[] { 1, 2, 3 }
where c1 == c2
orderby c1
select c1;
我无法理解为什么q2也不是IOrderedEnumerable< int>.
使用’join’子句没有区别:
// q3 is IEnumerable<int>
var q3 = from c1 in new[] { 1, 2, 3 }
join c2 in new[] { 1, 2, 3 }
on c1 equals c2
orderby c1
select c1;
最佳答案 在第一个查询中,没有执行正在执行的Select操作.选择是选择序列中的当前项,这是一个无操作,因此简单地省略了Select调用.省略Select调用后,OrderBy是查询中的最后一个调用,它返回IOrderedEnumerable< T>.
对于第二个(和第三个)查询,select实际上选择了一些有意义的东西,并且不能省略. (在第二个查询中,SelectMany将返回匿名类型的IEnumerable,第三个查询中的Join也是如此.)因此,在这些情况下,Select仍然存在于查询中,并且Select返回IEnumerable< T>.
当您查看查询转换为什么时,这很容易,这将是以下的道德等价物:
var q1a = new[] { 1, 2, 3 }.OrderBy(c1 => c1);
var q2a = new[] { 1, 2, 3 }.SelectMany(c1 => new[] { 1, 2, 3 }.Select(c2 => new { c1, c2 }))
.Where(variables => variables.c1 == variables.c2)
.OrderBy(variables => variables.c1)
.Select(variables => variables.c1);
var q3a = new[] { 1, 2, 3 }.Join(new[] { 1, 2, 3 }, c1 => c1, c2 => c2, (c1, c2) => new { c1, c2 })
.OrderBy(variables => variables.c1)
.Select(variables => variables.c1);
鉴于这些是您的查询等价的,应该清楚为什么只有第一个返回IOrderedEnumerable< int>.