再次理解 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 <& ...
随机推荐
- java实现带空格字符串的倒序输出
import org.junit.Test; public class StringtoChar { @Test public void main(){ String str ="hello ...
- 第一册:lesson eighty one.
原文: Roast beef and potatoes. A:Hi,Carol,where is Tom? B:He is upstairs.He is having a bath. Tom,Sam' ...
- Thread类(线程)
操作系统通过线程对程序的执行进行管理,当操作系统运行一个程序的时候,首先,操作系统将为这个准备运行的程序分配一个进程,以管理这个程序所需要的各种资源.在这些资源之中,会包含一个称为主线程的线程数据结构 ...
- SQL 語法
查詢 Sql = ("SELECT A1, A2, A5, A4 FROM Table1 ") 筆數 Sql = ("Select COUNT(*) From TW01. ...
- Java_Comparable,Comparator两接口区别
Comparable和Comparator的区别 根本区别 1.Comparable是一个内比较器,Comparator是一个外比较器 封装的包不同 java.util.Comparator java ...
- JS预解析机制
JS的预解析过程: 1,预解析 2,再逐行解读代码, 实例: ---------------------------- <script> var name="xm& ...
- Js中的闭包原理
要了解清楚js中的闭包制机,那么得先了解全局执行环境.块级执行环境.函数执行环境.变量对象.环境栈.作用域链.摧毁执行环境. 全局执行环境 全局执行环境指的是最外层的执行环境.在web中全局执行环境被 ...
- CSS网页中导入特殊字体@font-face属性详解
@font-face是CSS3中的一个模块,他主要是把自己定义的Web字体嵌入到你的网页中. 语法规则 首先我们一起来看看@font-face的语法规则: @font-face { font-fami ...
- CSS3属性animation-play-state控制动画运行或暂停的技巧
animation-play-state介绍 animation-play-state 属性规定动画正在运行还是暂停. div{ animation-play-state:paused; -webki ...
- 洛谷P1516 青蛙的约会
题目描述 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清 ...