c# - 带有 orderby 子句的 linq 查询的返回类型不一致

标签 c# linq

有谁知道为什么这两个查询结果的类型不同?

// 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/

相关文章:

c# - 如何在 .NET Standard 2.0 项目上实现 Dotfuscator?

c# - Linq 查询合并 2 个列表

asp.net - MVC3数据缓存技术

c# - Entity Framework linq 包含和分组

c# - 在 C# 中使用泛型、约束和继承时出现编译时错误 : "Cannot convert from B to T1",

c# - Unity 根据设备方向自动旋转屏幕对象

c# - 是否可以强制显式实现接口(interface)(或接口(interface)的一部分)?

c# - Enumerable.Range - 什么时候使用它有意义?

c# - C# 和 VB 之间的 Linq Select 编译方式不同

c# - 如何使用 .Net 从端点下载证书?