有谁知道为什么这两个查询结果的类型不同?
// 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>
.
使用“加入”子句没有区别:
// 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
call 被简单地省略了。随着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>
。 .
关于c# - 带有 orderby 子句的 linq 查询的返回类型不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44167189/