C# 在LINQ中将查询理解转换为可枚举扩展方法

C# 在LINQ中将查询理解转换为可枚举扩展方法,c#,linq,list-comprehension,C#,Linq,List Comprehension,如何将以下查询转换为函数调用?我知道编译器是在幕后做这件事的,但不知道我会如何看待结果 var query = from item in Enumerable.Range(0, 10) from item2 in Enumerable.Range(item, 10) from item3 in Enumerable.Range(item2, 10) select

如何将以下查询转换为函数调用?我知道编译器是在幕后做这件事的,但不知道我会如何看待结果

        var query = from item in Enumerable.Range(0, 10)
                    from item2 in Enumerable.Range(item, 10)
                    from item3 in Enumerable.Range(item2, 10)
                    select new { item, item2, item3 };
在本例中,它使用SelectMany和一个称为透明标识符的概念,该概念保留了现有的范围变量。因此,您的查询将转换为:

        var query = from item in Enumerable.Range(0, 10)
                    from item2 in Enumerable.Range(item, 10)
                    from item3 in Enumerable.Range(item2, 10)
                    select new { item, item2, item3 };
var query = Enumerable.Range(0, 10)
                      .SelectMany(item => Enumerable.Range(item, 10),
                                  (item, item2) => new { item, item2 })
                      .SelectMany(z => Enumerable.Range(z.item2, 10),
                                  (z, item3) => new { z.item, z.item2, item3 });
在本例中,z是透明标识符。如果在最后一个from子句之后有where子句或除select之外的任何内容,则会引入另一个透明标识符

        var query = from item in Enumerable.Range(0, 10)
                    from item2 in Enumerable.Range(item, 10)
                    from item3 in Enumerable.Range(item2, 10)
                    select new { item, item2, item3 };

翻译都在C语言规范第7.16节中进行了描述。

您是在问这个特定查询到方法链的翻译是什么?还是更一般的问题,即如何查看LINQ查询的方法链版本?主要是询问前者,但后者也有兴趣。对于后者,这不是一个真正的答案,但我会提供ReSharper将在IDE中为您进行转换
        var query = from item in Enumerable.Range(0, 10)
                    from item2 in Enumerable.Range(item, 10)
                    from item3 in Enumerable.Range(item2, 10)
                    select new { item, item2, item3 };