Tej*_*jas 30 .net c# linq deferred-execution
找出哪些.net框架linq方法(例如.IEnumerable linq方法)使用延迟执行而不是使用延迟执行实现的最快方法是什么.
虽然编码很多次,但我想知道这个是否会以正确的方式执行.找出答案的唯一方法是访问MSDN文档以确保.会不会有更快的方式,任何目录,网络上的任何列表,任何备忘单,你可以分享的任何其他技巧?如果是,请这样做.这将有助于许多linq新手(像我一样)减少错误.唯一的另一个选择是检查文档,直到一个人使用它们足以记住(这对我来说很难,我往往不记得在某处记录的"任何东西",可以查找:D).
Guf*_*ffa 37
通常,返回序列的方法使用延迟执行:
IEnumerable<X> ---> Select ---> IEnumerable<Y>
Run Code Online (Sandbox Code Playgroud)
和返回单个对象的方法不会:
IEnumerable<X> ---> First ---> Y
Run Code Online (Sandbox Code Playgroud)
因此,类似的方法Where
,Select
,Take
,Skip
,GroupBy
和OrderBy
使用延迟执行,因为他们可以,而类似的方法First
,Single
,ToList
而ToArray
不要因为他们不能.
还有两种类型的延迟执行.例如,该Select
方法在被要求生成项目时一次只能获得一个项目,而该OrderBy
方法在被要求返回第一个项目时将不得不消耗整个源项目.因此,如果您OrderBy
在a之后链接Select
,则执行将推迟到您获得第一个项目,但随后OrderBy
将询问Select
所有项目.
我使用的指南:
始终假设任何返回IEnumerable<T>
或IQueryable<T>
可能并且可能将使用延迟执行的API .如果您正在使用这样的API,并且需要多次迭代结果(例如,获取Count),则在执行此操作之前转换为集合(通常通过调用.ToList()扩展方法.
如果您正在公开枚举,请始终将其公开为集合(ICollection<T>
或IList<T>
),如果这是您的客户通常使用的集合.例如,数据访问层通常会返回域对象的集合.仅IEnumerable<T>
在延迟执行是您正在公开的API的合理选项时公开.
实际上,还有更多; 此外,您需要考虑缓冲与非缓冲.OrderBy可以延迟,但迭代时必须使用整个流.
一般来说,在LINQ任何返回IEnumerable的往往要推迟-而敏等(其中返回值)不被推迟.缓冲(vs not)通常可以被推理,但坦率地说反射器是一种非常快速的方法来确定.但请注意,无论如何,这通常是一个实现细节.
归档时间: |
|
查看次数: |
9126 次 |
最近记录: |