让我们从基础开始,可能会重复一些你已经知道的信息。在LINQ性能优化中最重要的一点,当然是延迟执行。那便意味着当你声明一个变量并分配给它一个查询字符串,其查询字符串并没有立即执行

// Query is not executed.

var query = from item in storage select item;

变量query现在存储着命令,查询执行被延迟直到你从变量query请求获取数据。这通常发生在如下几种情况:foreach循环,或当你调用一个聚集函数像Min,Max和Average,或当你使用ToList或ToArray方法缓存该查询结果。

// foreach循环。foreach (var item in query)Console.WriteLine(item);// Count函数。int total = query.Count();// ToArray方法。var cachedQuery = query.ToArray();

现在让我们来看看幕后究竟发生了什么。在查询执行的时候是否有什么编译器级的优化发生?答案是yes。然而,这里有个陷阱。从现在起我们将只讨论使用“LINQ to Objects”提供程序对IEnumerable和IEnumerable<T>集合的查询。对于其他LINQ提供程序,包括LINQ to SQL和LINQ to XML,可能应用的是不同的优化规则。

注意:人们常常认为,由于延迟执行,执行第一次查询需要花费更长时间。然而,在LINQ to Objects中,第一次执行和之后的每一次并没有差别。其他LINQ提供程序的规则可能不同(比如,这里可能有些会进行缓存),但你需要参考特定的提供程序的详细文档。

LINQ to Objects查询在下面这些情况下会做优化:

  • 一些方法调用会被优化,如果数据源实现了一个必要的接口。下面表格列出了这些优化。
LINQ方法 优化
Cast 如果数据源已经对给定的类型T实现接口IEnumerable<T>,则会直接返回数据序列而不需要转换。
Contains 如果数据源实现了接口ICollection或ICollection<T>,其接口的相应的方法会被使用。
Count 如果数据源实现了接口IList或IList<T>,接口的Count方法和索引器会被使用。
ElementAt
ElementAtOrDefault
First
FirstOrDefault
Last
LastOrDefault
Single
SingleOrDefault
如果连续的一个或多个Select操作后面跟着连续的一个或多个Where操作,查询只会创建一个IEnumerable或IEnumerable<T>对象而不会创建中间对象。

考虑下面的查询:

var query = from item in storagewhere item.Category = "Food"where item.Price < 100select item;

在这里,查询只会创建一个IEnumerable对象。

  • 如果你查询一个数组或List,接口IEnumerable或IEnumerable<T>不会在foreach循环中使用枚举器。相反,在使用前会创建一个数组或List的简单for循环,元素被直接访问。

此外,where操作符实现了简单的if语句,所以不会有中间的枚举器产生。

再次说明,其他LINQ提供程序可能拥有它们自己的性能优化规则。但上面的规则应该能给你一些怎么使用LINQ to Objects的意见。

原文:Alexandra Rusina Does the “LINQ to Objects” provider have built-in performance optimization?

【转】http://www.cnblogs.com/tianfan/archive/2010/03/03/does-the-linq-to-objects-provider-have-built-in-performance-optimization.html

*也是准备翻译,正好tianfan做过了。所以直接转到这里。辛苦辛苦

转载于:https://www.cnblogs.com/RuiLei/archive/2010/05/30/1747733.html

Does the “LINQ to Objects” provider have built-in performance optimization?相关推荐

  1. [翻译]“LINQ to Objects”提供程序是否内置性能优化?

    原文来自Alexandra Rusina在CSharpFAQ的:Does the "LINQ to Objects" provider have built-in performa ...

  2. 【翻译】Pro LINQ Language Integrated Query in C# 2008 -- 第三章 (LINQ TO Objects) 第一节

    LINQ到Objects LINQ到Objects介绍 示例 3-1. 一个LINQ到Objects查询的示例. string[] presidents = {     "Adams&quo ...

  3. 从LINQ开始之LINQ to Objects(上)

    LINQ概述 LINQ,语言集成查询(Language Integrated Query),它允许使用C#或VB代码以查询数据库相同的方式来操作不同的数据源. LINQ体系结构 从上图可以看出,LIN ...

  4. 从LINQ开始之LINQ to Objects(下)

    前言 上一篇<从LINQ开始之LINQ to Objects(上)>主要介绍了LINQ的体系结构.基本语法以及LINQ to Objects中标准查询操作符的使用方法. 本篇则主要讨论LI ...

  5. 查询表达式和LINQ to Objects

    查询表达式实际上是由编译器"预处理"为"普通"的C#代码,接着以完全普通的方式进行编译.这种巧妙的发式将查询集合到了语言中,而无须把语义改得乱七八糟 LINQ的 ...

  6. LINQ: Reconciling objects, relations and XML in the .NET framework

    自己译的,感觉意译挺多,不中足之处还请见谅,也算帮找这篇文章的朋友一个忙,转载前没有见过相关协议与说明,如果此篇翻译侵犯了作者权益,请与本人联系,本人将关闭此文章 LINQ: Reconciling  ...

  7. 自己动手重新实现LINQ to Objects: 9 - SelectMany

    本文翻译自Jon Skeet的系列博文"Edulinq". 本篇原文地址: http://msmvps.com/blogs/jon_skeet/archive/2010/12/27 ...

  8. Linq to objects示例

    与linq to sql类似,所有继承了IEnumerable的类型均可使用LINQ,如下string[]数组基类为Array,而Array实现了IEnumerable,所以也可使用linq stat ...

  9. [转]打造自己的LINQ Provider(上):Expression Tree揭秘

    概述 在.NET Framework 3.5中提供了LINQ 支持后,LINQ就以其强大而优雅的编程方式赢得了开发人员的喜爱,而各种LINQ Provider更是满天飞,如LINQ to NHiber ...

最新文章

  1. mac 下 mamp 配置虚拟主机步骤
  2. 我的征程是未来!带你展望2015年最重要的网页设计趋势
  3. java HashMap和LinkedHashMap区别
  4. Android项目打包开启proguard的混淆优化带来的问题
  5. jquery 操作字符串、数组、对象常用方法
  6. java编程东西好多记不住_课程总结
  7. mysql 失效转移_MySQL基于MHA的FailOver过程
  8. ngnix 作用(通俗易懂)【转载】
  9. python3 random模块操作
  10. Sublime和LaTeX支持
  11. 一台手机苹果含泪赚4000?iPhone 12硬件成本曝光
  12. python中set index_Python set_index和reset_index详解
  13. Spring学习(全)
  14. pdf 加深 扫描件_扫描文字字体如何加深 pdf扫描件字体加深
  15. android音视频开发进阶指南,音视频开发进阶指南:基于Android与iOS平台的实践
  16. sam账号服务器已断开连接,删了sam文件后引发的IIS问题的解决方法
  17. java多边形填充_关于java:从图像(填充形状)生成多边形
  18. Nwafu-OJ-1511 Problem 封闭的圆圈
  19. C++应用之自定义大整数类
  20. 【翻译】2020年云安全综合指南(风险,最佳实践,认证)

热门文章

  1. mysql 子分区_MySQL子分区一例
  2. nstimer循环引用_解决NSTimer循环引用导致内存泄漏的六种方法
  3. python大数据结课报告_2020知到大数据分析的PYTHON基础结课答案
  4. oracle 查询字段除了as,Oracle中怎样查询数据表的哪个字段是主键
  5. python黑色变白色_使用Python openCV PIL将黑色更改为白色,但不将白色更改为黑色...
  6. CStopWatch计时器的用法实例
  7. java zipinputstream_Java之解压流(ZipInputStream)
  8. 软件测试人员需要掌握的linux命令(一)
  9. Python 进阶之路 (九) 再立Flag, 社区最全的itertools深度解析(上)
  10. 使用for循环遍历文件