linq"let"翻译我的理解是,当C#编译器看到一个linqquerycomprehension的时候,基本上直接翻译成相应的LinqExtensionmethods和lambdas。即fromxinlistselectx.property被翻译成:list.Select(x=>x.property)我的问题是let子句被翻译成什么。例如,编译器如何翻译它。fromxinlistletv=SomeComplexExpressionDependingOnxselectv(ps我知道这可以简化为只选择SomeComplexExpressionDependingOnx但我想知道这是怎么做的)谢谢!在这种特殊情况下,它被翻译成:list.Select(x=>SomeComplexExpressionDependingOnx);但可能会有更复杂的情况,例如:fromxinlistletv=SomeComplexExpressionDependingOnxwherev>10&&v+5将转换为:list.Where(x=>{varv=SomeComplexExpressionDependingOnx;returnv>10&&v+5换句话说,let关键字是一种最小化和/或优化查询的方法。也就是说,如果没有let关键字,您将不得不写:fromxinlistwhereSomeComplexExpressionDependingOnx>10&&SomeComplexExpressionDependingOnx+5resultinginapossible同一表达式的三重评估。在评论中提出问题后更新。首先,“块表达式”有什么可怕的?它们只是任意表示的简写。即下面的表达式:Funcf=s=>{varln=s.Length;返回ln/2;}等效于以下内容:intCompilerGeneratedMethodIdentifier0(strings){varln=s.Length;返回ln/2;}...Funcf=newFunc(CompilerGeneratedMethodIdentifier0);其次,“块表达式”有什么特别之处?你知道吗……让我们称它们为“非块”表达式也扩展为相同的代码?也就是说,简单代码newFunc(s=>s.Length/2)绝对等同于:intCompilerGeneratedMethodIdentifier0(strings){returns.Length/2;}...newFunc(CompilerGeneratedMethodIdentifier0);三、关于“块表达式”的内容是什么?LINQ在任何地方都使用委托,LINQ用来表示这些委托的确切快捷方式并不重要。特别是,来自ainlistwherea.SomeProp>10selectnew{A=a,B=a.GetB()}的表达式转换为以下内容:classAnonymousType0{publicMyClassA{get;放;}publicothertypeB{get;放;}}boolWhereFunc0(MyClassa){returna.SomeProp>10;}AnonymousType0SelectResultFunc0(MyClassa){AnonymousType0result=newAnonymousType0();结果.A=a;结果.B=a.得到B();返回结果;}...列表.Where(newFunc(WhereFunc0)).Select(newFunc(SelectResultFunc0));第四,要获得这样的理解,可以玩弄语言和思维。动动脑筋,仅此而已。第五,如果之前的建议由于某种原因对你不起作用,那么你总是有ILSpy。非常有用的工具,每个人都应该拥有一个。看看LINQPad,您可以编写查询并点击lamba符号来查看输出。例如,我使用了这个查询:varnames=new[]{"Tom","Dick","Harry","Mary","Jay"}.AsQueryable();varresults=fromninnamesletn1=String.IsNullOrEmpty(n)selectn1;结果.转储();它输出以下内容:System.String[].Select(n=>new{n=n,n1=String.IsNullOrEmpty(n)}).Select(temp0=>temp0.n1)所以看起来let确实是转换为匿名的临时值,然后在外部select语句中使用。我喜欢LINQPad能够编写查询并查看它将如何翻译。只是一个猜测,因为我很少使用查询语法:list.Select(x=>new{v=SomeComplexExpressionDependingOnx(x)});let只是分配一个新的varv并且select返回它。如果你不想要一个带有v的匿名对象,它也可以是以下内容:varv=list.Select(x=>SomeComplexExpressionDependingOnx(x));list.Select(x=>SomeComplexExpressionDependingOnx);通常,let基本上用作只读变量来保存作用域。以上就是C#学习教程:linq“让”翻译分享全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
