在介绍tolist()的时候我先个大家介绍一下linq的延迟加载:

 var products = new List<Product>
{
new Product { Name = "CD Player", Id = , Category = "Electronics" },
new Product { Name = "DVD Player", Id = , Category = "Electronics" },
new Product { Name = "Blu-Ray Player", Id = , Category = "Electronics" },
new Product { Name = "LCD TV", Id = , Category = "Electronics" },
new Product { Name = "Wiper Fluid", Id = , Category = "Automotive" },
new Product { Name = "LED TV", Id = , Category = "Electronics" },
new Product { Name = "VHS Player", Id = , Category = "Electronics" },
new Product { Name = "Mud Flaps", Id = , Category = "Automotive" },
new Product { Name = "Plasma TV", Id = , Category = "Electronics" },
new Product { Name = "Washer", Id = , Category = "Appliances" },
new Product { Name = "Stove", Id = , Category = "Electronics" },
new Product { Name = "Dryer", Id = , Category = "Electronics" },
new Product { Name = "Cup Holder", Id = , Category = "Automotive" },
}; // select all electronics, there are 7 of them
IEnumerable<Product> electronicProducts = products.Where(p => p.Category == "Electronics"); // now clear the original list we queried
products.Clear(); // now iterate over those electronics we selected first
Console.WriteLine(electronicProducts.Count());

许多扩展方法(包括Where() )的查询结果是创建一个迭代器通过移动列表来执行查询。 因此,此时的electronicProducts不是List<Product>,只是IEnumerable<Product>,它会在您使用这个列表时动态求值. 这就是LINQ中强大的延迟执行,在你需要结果前,都不会对表达式求值。 此时我们可以去查询electronicProducts,这样我们就可以得到结果列表!

但是如果我们换一种写法这个值就会是7:

 var electronicProducts = products.Where(p =>  p.Category == "Electronics").ToList();

现在,  List<T>代替 electronicProducts 作为IEnumerable<T> 动态执行的原始集合,这将是另一个新的集合,修改不会影响原来的集合。

当然,这有优点也有缺点。 通常,如果你只是要遍历的结果和过程,你不需要(也不想)将它存储在一个单独的列表,这只会浪费内存,后来还需要垃圾收集。 然而,如果你想保存子集,并将它分配给另一个类,ToList()是非常方便的,你不需要担心改变原来的集合。

ToList()内存消耗

tolist和lazy load是对立的 ,tolist是直接将linq语句的执行结果放于list集合中,直接将结果存放在内存中,所以数据量大的时候,使用tolist要谨慎。

c# tolist() 浅析的更多相关文章

  1. 【Spark Core】任务运行机制和Task源代码浅析1

    引言 上一小节<TaskScheduler源代码与任务提交原理浅析2>介绍了Driver側将Stage进行划分.依据Executor闲置情况分发任务,终于通过DriverActor向exe ...

  2. 浅析Entity Framework Core2.0的日志记录与动态查询条件

    前言 Entity Framework Core 2.0更新也已经有一段时间了,园子里也有不少的文章.. 本文主要是浅析一下Entity Framework Core2.0的日志记录与动态查询条件 去 ...

  3. 浅析Entity FrameWork性能优化

    浅析EF性能优化 1.       数据Load 延迟加载:当实体第一次读取时,相关数据没有加载:当第一次试图访问导航属性时,所需的导航数据自动加载,EF默认使用这种方式加载数据,尽量使用预先加载和显 ...

  4. 【Spark】Stage生成和Stage源代码浅析

    引入 上一篇文章<DAGScheduler源代码浅析>中,介绍了handleJobSubmitted函数,它作为生成finalStage的重要函数存在.这一篇文章中,我将就DAGSched ...

  5. SQL Server on Linux 理由浅析

    SQL Server on Linux 理由浅析 今天的爆炸性新闻<SQL Server on Linux>基本上在各大科技媒体上刷屏了 大家看到这个新闻都觉得非常震精,而美股,今天微软开 ...

  6. 【深入浅出jQuery】源码浅析--整体架构

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  7. 高性能IO模型浅析

    高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking  ...

  8. netty5 HTTP协议栈浅析与实践

      一.说在前面的话 前段时间,工作上需要做一个针对视频质量的统计分析系统,各端(PC端.移动端和 WEB端)将视频质量数据放在一个 HTTP 请求中上报到服务器,服务器对数据进行解析.分拣后从不同的 ...

  9. Jvm 内存浅析 及 GC个人学习总结

    从诞生至今,20多年过去,Java至今仍是使用最为广泛的语言.这仰赖于Java提供的各种技术和特性,让开发人员能优雅的编写高效的程序.今天我们就来说说Java的一项基本但非常重要的技术内存管理 了解C ...

随机推荐

  1. bzoj 4444: [Scoi2015]国旗计划

    Description A国正在开展一项伟大的计划--国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这 项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了N名优秀的 ...

  2. P神的SDFZ考试题 C题

                                                                      探险[问题描述]          探险家小 T 好高兴! X 国要 ...

  3. 限制ssh远程登陆

    超过十次,就添加到hosts.deny里面去 #!/bin/bash date=`date +%Y%m%d` file="/var/log/secure" max=10 if [[ ...

  4. JavaScript的DOM编程--09--节点的替换

    节点的替换: 1). replaceChild(): 把一个给定父元素里的一个子节点替换为另外一个子节点 var reference = element.replaceChild(newChild,o ...

  5. Django学习日记05_模板_模板语言

    Variables 在模板中,使用两个大括号包含变量的方式来使用变量: {{ name }} 该变量应该作为键值对中的键,在Context中能被查找到. Tags 模板中使用Tags来进行简单的逻辑: ...

  6. windows 下运行angualr/material2 项目

    第一步:到github上clone  angular/material2 项目 第二步:npm install 第三步: 打开git bash (cmd 或 powershell 是无法成功运行该项目 ...

  7. android散点技术

    1.怎么实现android虚拟按键(回退和回到主界面) android 中如何模拟back键 2.怎么用局域网的方式(wifi或是网线)来调试android机 参考资料: http://www.ith ...

  8. vb实验7-找出小于18000的最大素数

    vb实验7-找出小于18000的最大素数 vb实验7-找出小于18000的最大素数 ---–写给女朋友的题解 在窗体上画一个文本框,名称为TEXT1,两个命令按钮,C1和 C2,标题分别为" ...

  9. Virtualbox虚拟机安装与设置

    Virtualbox与VMware类似,都是虚拟机软件,在win10下安装Virtualbox直接默认安装即可.版本:VirtualBox-5.2.0-118431-Win.exe 安装完成后,点击左 ...

  10. [笔记]《JavaScript高级程序设计》- JavaScript简介

    JavaScript实现 虽然JavaScript和ECMAScript通常都被人们用来表达相同的含义,但JavaScript的含义却比ECMA-262中规定的要多得多.一个完整的JavaScript ...