再次理解 C# LINQ
语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称。
查询表达式(生成表达式)
1、IEnumerable<T> 查询编译为委托。如 source.Where(m=>m.Id>1) 返回一个表达式,这个表达式可以转为委托。
2、 IQueryable 和 IQueryable<T> 查询编译为表达式树。
存储查询结果(计算表达式)
- foreach、序列化、求值 或其他访问数据项的行为
两个测试帮助理解 什么是生成表达式什么是计算表达式
public static class ListTest
{
public static List<T1> Source { get; set; } = new List<T1>
{
new T1{ Id=, Name="" },
new T1{ Id=, Name="" },
new T1{ Id=, Name="" },
new T1{ Id=, Name="" },
new T1{ Id=, Name="" },
new T1{ Id=, Name="" },
new T1{ Id=, Name="" },
new T1{ Id=, Name="" },
new T1{ Id=, Name="" },
};
public static void Test()
{
//注意循环性能 foreach (T1 item in Source)
{
if (item.Id <= )
{
continue;
}
//do something
} /**
// loop start (head: IL_002c)
IL_000f: ldloca.s 0
IL_0011: call instance !0 valuetype [mscorlib]System.Collections.Generic.List`1/Enumerator<class IListTest.T1>::get_Current()
IL_0016: stloc.1
IL_0017: nop
IL_0018: ldloc.1
IL_0019: callvirt instance int32 IListTest.T1::get_Id()
IL_001e: ldc.i4.1
IL_001f: cgt
IL_0021: ldc.i4.0
IL_0022: ceq
IL_0024: stloc.2
IL_0025: ldloc.2
IL_0026: brfalse.s IL_002b IL_0028: nop
IL_0029: br.s IL_002c IL_002b: nop IL_002c: ldloca.s 0
IL_002e: call instance bool valuetype [mscorlib]System.Collections.Generic.List`1/Enumerator<class IListTest.T1>::MoveNext()
IL_0033: brtrue.s IL_000f
// end loop
*/ foreach (T1 item in Source.Where(m =>
{
return m.Id > ;
}))
{
//do something
} /*
// loop start (head: IL_0082)
IL_0078: ldloc.3
IL_0079: callvirt instance !0 class [mscorlib]System.Collections.Generic.IEnumerator`1<class IListTest.T1>::get_Current()
IL_007e: stloc.s 4
IL_0080: nop
IL_0081: nop IL_0082: ldloc.3
IL_0083: callvirt instance bool [mscorlib]System.Collections.IEnumerator::MoveNext()
IL_0088: brtrue.s IL_0078
// end loop */ }
}
private static string tag;
private static void Main(string[] args)
{ tag = "s";
//IEnumerable<T1> s = Init();//不同实例
List<T1> s = Init().ToList();//同实例
tag = "s2";
IEnumerable<T1> s2 = s.ToList();
if (ReferenceEquals(s.First(m => m.Id == ), s2.First(m => m.Id == )))
{
System.Console.WriteLine("同实例");
}
else
{
System.Console.WriteLine("不同实例");
}
System.Console.ReadLine();
} private static IEnumerable<T1> Init()
{
for (int i = ; i < ; i++)
{
System.Console.WriteLine(tag);
yield return new T1 { Id = i, Name = "name_" + i };
}
}
注意每次计算表达式时都会去生成新的实例,某些情况下不知晓会非常危险。
参考:https://docs.microsoft.com/zh-cn/dotnet/csharp/linq/index
https://docs.microsoft.com/zh-cn/dotnet/csharp/expression-trees
再次理解 C# LINQ的更多相关文章
- 再次理解HTTP请求过程[概念原理篇]
我曾多次阅读http协议,但是理解依然不深,在此,再次阅读,再次理解.加深两点:解析头部信息\r\n,分解头部和主体用\r\n\r\n.之所以一次请求会看到网络里有很多请求,是因为浏览器代替访问了多次 ...
- 再次理解WCF以及其通信(附加一個編程小經驗)
一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...
- 再次理解JavaScript原型链和匿名函数
<!--------------------------------------------- 1.演示匿名加载 2.js单进程执行流 3.原型链理解 a.__proto__:属性每个对象都有 ...
- F - Warm up HDU - 4612 tarjan缩点 + 树的直径 + 对tajan的再次理解
题目链接:https://vjudge.net/contest/67418#problem/F 题目大意:给你一个图,让你加一条边,使得原图中的桥尽可能的小.(谢谢梁学长的帮忙) 我对重边,tarja ...
- 再次理解HTTP GET协议
概述: 在上学的时候,以及在工作的这几年中,我一直错误了理解HTTP GET. 以前我的认知中认为GET/POST的区别在于: 1.GET长度限制 2.GET和POST的请求方式不一样(之前所理解的G ...
- 再次理解js中的call函数
a.call(b); 网上说明的版本比较多.有的说,是指针替换.有说,将a对象的方法加在b对象执行.官方说:什么对象替换什么对象.反正看了几个版本,尽管有具体的实例,看了我三次都没看懂它的具体含义.看 ...
- [转载]java.ByteArrayInputStream与ByteArrayOutputStream再次理解
一次看到ByteArrayOutputStream的时候是在Nutch的部分源码,后来在涉及IO操作时频频发现这两个类的踪迹,觉得确实是很好用,所以把它们的用法总结一下. ByteArrayOutpu ...
- 再次理解javascript的apply
普通函数执行的时候,this指向函数执行的上下文 其实就是一个原型链的结构... 我一直没有搞懂原型链莫非它们像链条一样连在一起? 昂... 原型链可以理解成继承吗? 就像,ja ...
- C++再次理解虚表
#include <iostream> using namespace std; class Base { public: virtual void fun1() { cout <& ...
随机推荐
- 翻译:CREATE TRIGGER语句(已提交到MariaDB官方手册)
本文为mariadb官方手册:CREATE TRIGGER的译文. 原文:https://mariadb.com/kb/en/create-trigger/我提交到MariaDB官方手册的译文:htt ...
- AngularJs_自定义注入对象_笔记1
A-自定义控件示例: 我的自定义控件文件为:angular-seagull2-common.js (function (window, angular) { 'use strict'; $urlPro ...
- C# 显式转换关键字 explicit
不同于隐式转换,显式转换运算符必须通过转换的方式来调用. 如果转换操作会导致异常或丢失信息,则应将其标记为 explicit. 这可阻止编译器静默调用可能产生意外后果的转换操作. 省略转换将导致编译时 ...
- Go实现基于WebSocket的弹幕服务
拉模式和推模式 拉模式 1.数据更新频率低,则大多数请求是无效的 2.在线用户量多,则服务端的查询负载高 3.定时轮询拉取,实时性低 推模式 1.仅在数据更新时才需要推送 2.需要维护大量的在线长连接 ...
- oracle中row_number() over()
ROW_NUMBER() OVER函数的基本用法语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)简单的说row_number()从1开 ...
- idea代码快捷
idea代码快捷:main函数快捷:psvmfor循环快捷:fori.foreach系统输出快捷:sout.serr 更多的提示可以按Ctrl+ J 进行查看 更改快捷:File-->Setti ...
- 微信小程序之发送模板消息(通过openid推送消息给用户)
一.获取access_token access_token是接口调用的凭证,目前有效期为两个小时,需要定时刷新,重复获取将导致上次获取的access_token失效.(注:不建议每次调用需要acces ...
- es6 语法 (解构赋值)
1.结构赋值 { let a,b,c; [a,b] = [1,2]; console.log(a,b); //1,2} { let a,b,rest; [a,b,...rest] = [1,2,3,4 ...
- 将HTML页面自动保存为PDF文件并上传的两种方式(一)-前端(react)方式
一.业务场景 公司的样本检测报告以React页面的形式生成,已调整为A4大小的样式并已实现分页,业务上需要将这个网页生成PDF文件,并上传到服务器,后续会将这个文件发送给客户(这里不考虑). 二.原来 ...
- 2018-01-02 JavaScript实现ZLOGO: 用语法树实现多层循环
原址: https://zhuanlan.zhihu.com/p/32571516 照例先上演示弱效果图. 演示地址照旧: 代码如下: 开始 循环4次 循环4次 前进50 左转90度 到此为止 右转9 ...