当前位置: 首页 > 编程语言 > C#

Linq查询语法和扩展方法分享

时间:2023-04-10 20:35:44 C#

Linq查询语法和扩展方法我通常更喜欢扩展方法,因为它们发现它们更容易阅读,但是在看到Erno对这个问题的回答之后,我想知道如何使用一个最小的查询只有扩展方法?更一般地说,是否存在可以以一种形式创建但不能以另一种形式创建的查询,或者这两种方法是否等效?在没有查询表达式的情况下,您可以在查询表达式中做任何事情-查询表达式只是被翻译成非查询表达式代码。有很多查询不能写在查询表达式中,但是......例如,任何使用Select重载的东西都会提供一个索引:varfoo=bar.Select((value,index)=>new{value,指数});...当然,查询表达式中根本不支持所有许多运算符(First等)。“最小”查询将对第二个from子句使用SelectMany,对let子句使用Select(引入新的透明标识符),对where子句使用Where,对select子句使用Select。来自ILSpy:这个varminimum=(fromp1indifferenceListfromp2indifferenceListletdistance=Math.Abs??(p1.X-p2.X)where!object.ReferenceEquals(p1,p2)orderbydistanceselectnew{Point1=p1,Point2=p2,Distance=distance}).First();is(kindacleaner)andcommentedvarminimum=differenceList//Thetwofrom.SelectMany(p1=>differenceList,(p1,p2)=>new{p1=p1,p2=p2})//让.Select(q=>new{q=q,distance=Math.Abs??(q.p1.X-q.p2.X)})//哪里.Where(r=>!object.ReferenceEquals(rqp1,rqp2))//Theorderby.OrderBy(r=>r.distance)//Thefinalselect.Select(r=>new{Point1=rqp1,Point2=rqp2,Distance=r.distance})//TheFirst.First();老实说,我唯一不知道如何“手动”做的是来自.我怀疑这是一个SelectMany,但我至少花了30分钟才破解它。如果您有兴趣,请转到ILSpyOptions->Decompiler并停用“Decompilequeryexpressions。某些查询只能使用扩展方法语法编写(尤其是查询语法不支持的扩展方法)。扩展方法语法支持所有内容,因为查询语法被编译为完全相同的扩展方法。另一方面,查询语法有一些比扩展方法语法更冗长的特性(let和一些joins)。join可以替换为SelectMany并使用Select引入匿名类型,该匿名类型既包括查询中的实际变量,也包括let子句中引入的变量。扩展方法语法的干净版本如下所示:differenceList.SelectMany(p1=>differencelist,(p1,p2)=>new{Point1=p1,Point2=p2,Distance=Math.Abs??(q.p1.X-q.p2.X)}).Where(e=>!object.ReferenceEquals(e.p1,e.p2)).OrderBy(e=>e.Distance).First();每个Linq表达式都可以使用扩展方法表示。无论如何,编译器都会将Linq翻译成它们。另一方面,并??非所有扩展方法都可以用Linq语法表达。以上就是《C#学习教程:Linq查询语法与扩展方法》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处: