Linq - 找出延期执行的最快方法是什么?

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,GroupByOrderBy使用延迟执行,因为他们可以,而类似的方法First,Single,ToListToArray不要因为他们不能.

还有两种类型的延迟执行.例如,该Select方法在被要求生成项目时一次只能获得一个项目,而该OrderBy方法在被要求返回第一个项目时将不得不消耗整个源项目.因此,如果您OrderBy在a之后链接Select,则执行将推迟到您获得第一个项目,但随后OrderBy将询问Select所有项目.

  • 替换"集合"=>"序列",我同意,但*集合*(List <T>等)通常*不*推迟. (2认同)

Joe*_*Joe 8

我使用的指南:

  • 始终假设任何返回IEnumerable<T>IQueryable<T>可能并且可能将使用延迟执行的API .如果您正在使用这样的API,并且需要多次迭代结果(例如,获取Count),则在执行此操作之前转换为集合(通常通过调用.ToList()扩展方法.

  • 如果您正在公开枚举,请始终将其公开为集合(ICollection<T>IList<T>),如果这是您的客户通常使用的集合.例如,数据访问层通常会返回域对象的集合.仅IEnumerable<T>在延迟执行是您正在公开的API的合理选项时公开.


Mar*_*ell 5

实际上,还有更多; 此外,您需要考虑缓冲与非缓冲.OrderBy可以延迟,但迭代时必须使用整个流.

一般来说,在LINQ任何返回IEnumerable的往往要推迟-而敏等(其中返回值)不被推迟.缓冲(vs not)通常可以被推理,但坦率地说反射器是一种非常快速的方法来确定.但请注意,无论如何,这通常是一个实现细节.