C#编译器在翻译LINQ表达式时如何选择SelectMany?Enumerable.SelectMany有4个重载签名。为简单起见,我们忽略带有int参数的两个签名。所以我们有4个SelectMany签名:C#编译器在将LINQ表达式转换为扩展方法调用时选择SelectMany?基本上,如果一个LINQ表达式中有多个from,就会有SelectMany。但是,C#编译器似乎只选择了第二个签名。第一个签名从不使用。IEnumerableen1=Enumerable.Range(1,3);IEnumerableen2=newdouble[]{1.0,3.14};IEnumerableen3=fromi1inen1fromi2inen2select(i1*i2).ToString();foreach(variinen3){Console.WriteLine(i);}在Reflector的帮助下,我可以看到上面的LINQ表达式被翻译成en1.SelectMany(delegate(inti1){returnen2;},delegate(inti1,doublei2){doubleCS$0$0000=i1*i2returnCS$0$0000.ToString();})上面的例子涉及3种类型。因此,选择第二个SelectMany签名是合理的。但是,对于下面的例子,只涉及一种类型,它仍然选择第二个签名。IEnumerableen4=fromi1inen1fromi2inEnumerable.Range(0,i1)selecti2;翻译成:en1.SelectMany(delegate(inti1){returnEnumerable.Range(0,i1);},delegate(inti1,inti2){returni2;})所以,我找不到案例其中LINQ表达式转换为第一个SelectMany签名。有没有这种情况?如果不使用第一个SelectMany签名,它存在只是因为它是函数式编程中monad的BIND?也许问题可能是:为什么我们有2个SelectMany签名?谢谢。根据C#规范,编译器不会生成对SelectMany第一个版本的重载的调用。SelectMany的第一个版本可用于将列表的列表展平为单个平面列表。publicIEnumerableExample(IEnumerable>enumerable){returnenumerable.SelectMany(x=>x);它在查询表达式中没有强等价物。有关详细信息,请参阅C#语言规范的第7.15.2节。为什么我们有2个SelectMany签名?所以我可以在我的代码中使用第一个。以上是C#学习教程:C#编译器在翻译LINQ表达式时如何选择SelectMany?如果分享的内容对你有用,需要了解更多C#学习教程,希望你多多关注——varorders=Customers.SelectMany(c=>c.Orders)本文采集自互联网,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
