原文章 : http://www.cnblogs.com/liulun/archive/2013/02/26/2909985.html

一、11个与LINQ有关的语言特性:
【隐式类型、匿名类型、对象初始化器】、【自动属性】、【委托、泛型、泛型委托】、【匿名方法、Lambda表达式——匿名方法的简化写法】、【扩展方法——对接口也生效、迭代器】

. 隐式类型 var num = ;
. 匿名类型 var obj = new {id=,name="aa"};
. 对象初始化器
var myObj = new MyObj(){id=, name="aa"};
----------------------------------------------------------------
. 自动属性
public string Title {get; set;}
----------------------------------------------------------------
. 委托:委托是一种类型
delegate bool MoreOrLessDelgate(int item); 委托类型,和类是一个级别的,它定义了某种方法规范。
委托对象,和对象是同级别的,它指向某个方法。
委托对象在使用时,实际上调用的是它指向的方法。
. 泛型:避免装箱拆箱操作时的类型转化的性能损耗。
预定义的泛型类型
List<T>
Dictionary<TKey, TValue>
自定义泛型类型
public class SomeFac<T>
{
public T(); public static T Instance()
{
return default(T);
}
}
自定义泛型类型时的泛型约束
public class SomeFac<T> where T: myObj
public class SomeFac<T> where T: myObj, new() //必须有一个构造函数 . 泛型委托
预定义的三种泛型委托
public delegate bool Predicate<in T>(T obj);//传入一个T类型的参数,返回bool类型的值 public delegate void Action<in T1...T16>(T1 obj1, ..)//传入0个到16个参数,无返回值
public delegate TResult Func<in T1...T16, TResult>(T1 obj1, ..)//传入0个到16个参数,返回一个T类型值 ---------------------------------------------------------------- . 匿名方法:delegate (int item){方法体};
var print = new Action<int>(delegate(int a){Console.WriteLine(a);});
其中,匿名方法代码如下:
delegate(int a){Console.WriteLine(a);} . Lambda表达式:匿名方法的简化写法
delegate(int a){Console.WriteLine(a);}
更改为:
a=>Console.WriteLine(a);//a的类型由编译器自动推断 var print = new Action<int>(delegate(int a){Console.WriteLine(a);});
简写为:
var print = new Action<int>(a=>Console.WriteLine(a)); =>是lambda操作符
    Console.WriteLine(a)是要执行的语句。
    如果是多条语句的话,可以用{}包起来。
    如果需要返回值的话,可以直接写return语句 ---------------------------------------------------------------- . 扩展方法
想给一个类型增加行为,通常是通过继承的方式实现。
新的方式是使用扩展方法。 public static void PrintString(this String val)
{
Console.WriteLinie(val);
} 之后,则可以这样调用。
var a = "aaa;
a.PrintString(); 本来string类型没有PrintString方法。
但通过我们上面的代码,就给string类型"扩展"了一个PrintString方法     
()先决条件
     <>扩展方法必须在一个非嵌套、非泛型的静态类中定义
     <>扩展方法必须是一个静态方法
     <>扩展方法至少要有一个参数【这个参数的类型就是增加行为的类型】
     <>第一个参数必须附加this关键字作为前缀
     <>第一个参数不能有其他修饰符(比如ref或者out)
     <>第一个参数不能是指针类型
    ()注意事项
     <>跟前面提到的几个特性一样,扩展方法只会增加编译器的工作,不会影响性能(用继承的方式为一个类型增加特性反而会影响性能)
     <>如果原来的类中有一个方法,跟你的扩展方法一样(至少用起来是一样),那么你的扩展方法奖不会被调用,编译器也不会提示你
     <>扩展方法太强大了,会影响架构、模式、可读性等等等等.... . 迭代器
每次针对集合类型编写foreach代码块,都是在使用迭代器
这些集合类型都实现了IEnumerable接口,都有一个GetEnumerator方法。
static IEnumerable<int> GetIterator()
{
Console.WriteLine("迭代器返回了1");
yield return ;
Console.WriteLine("迭代器返回了2");
yield return ;
Console.WriteLine("迭代器返回了3");
yield return ;
}
yield 关键字,在迭代器块中用于向枚举数对象提供值或发出迭代结束信号。 注意事项
<>做foreach循环时多考虑线程安全性      
     在foreach时不要试图对被遍历的集合进行remove和add等操作
     任何集合,即使被标记为线程安全的,在foreach的时候,增加项和移除项的操作都会导致异常
     (我在这里犯过错)
<>IEnumerable接口是LINQ特性的核心接口
     只有实现了IEnumerable接口的集合
     才能执行相关的LINQ操作,比如select,where等
     这些操作,我们接下来会讲到。
----------------------------------------------------------------
二、Linq
【查询操作符、查询表达式】
1. 查询操作符
  (1)源起
.net的设计者在类库中定义了一系列的扩展方法
来方便用户操作集合对象
这些扩展方法构成了LINQ的查询操作符
  (2)使用
这一系列的扩展方法,比如:
Where,Max,Select,Sum,Any,Average,All,Concat等
都是针对IEnumerable的对象进行扩展的
也就是说,只要实现了IEnumerable接口,就可以使用这些扩展方法 List<int> arr = new List<int>() { 1, 2, 3, 4, 5, 6, 7 };
var result = arr.Where(a => { return a > 3; }).Sum(); Where扩展方法,需要传入一个Func<int,bool>类型的泛型委托
这个泛型委托,需要一个int类型的输入参数和一个布尔类型的返回值
我们直接把a => { return a > 3; }这个lambda表达式传递给了Where方法
a就是int类型的输入参数,返回a是否大于3的结果 Sum扩展方法计算了Where扩展方法返回的集合的和。   (3)好处
arr.Where(a => { return a > 3; }).Sum();
等同于
(from v in arr where v > 3 select v).Sum();   (4)标准查询操作符说明
<1>过滤
  Where
  用法:arr.Where(a => { return a > 3; })
  说明:找到集合中满足指定条件的元素
  OfType
  用法:arr.OfType<int>()
  说明:根据指定类型,筛选集合中的元素
<2>投影
  Select
  用法:arr.Select<int, string>(a => a.ToString());
  说明:将集合中的每个元素投影的新集合中。上例中:新集合是一个IEnumerable<String>的集合
  SelectMany
  用法:arr.SelectMany<int, string>(a => { return new List<string>() { "a", a.ToString() }; });
  说明:将序列的每个元素投影到一个序列中,最终把所有的序列合并
<3>还有很多查询操作符,请翻MSDN,以后有时间我将另起一篇文章把这些操作符写全。  2. 查询表达式
(1)源起
  上面我们已经提到,使用查询操作符表示的扩展方法来操作集合
  虽然已经很方便了,但在可读性和代码的语义来考虑,仍有不足
  于是就产生了查询表达式的写法。
  虽然这很像SQL语句,但他们却有着本质的不同。
(2)用法
  from v in arr where v > 3 select v
  这就是一个非常简单的查询表达式

  

30分钟LINQ教程的学习笔记的更多相关文章

  1. 30分钟LINQ教程【转】

    千万别被这个页面的滚动条吓到!!! 我相信你一定能在30分钟之内看完它!!! 在说LINQ之前必须先说说几个重要的C#语言特性 一:与LINQ有关的语言特性 1.隐式类型 (1)源起 在隐式类型出现之 ...

  2. 偷窥篇:重要的C#语言特性——30分钟LINQ教程

    本文转自:http://www.cnblogs.com/liulun/archive/2013/02/26/2909985.html 千万别被这个页面的滚动条吓到!!! 我相信你一定能在30分钟之内看 ...

  3. 30分钟LINQ教程(转)

    在说LINQ之前必须先说说几个重要的C#语言特性 一:与LINQ有关的语言特性 1.隐式类型 (1)源起 在隐式类型出现之前, 我们在声明一个变量的时候, 总是要为一个变量指定他的类型 甚至在fore ...

  4. 30分钟LINQ教程

    在说LINQ之前必须先说说几个重要的C#语言特性 一:与LINQ有关的语言特性 1.隐式类型 (1)源起 在隐式类型出现之前, 我们在声明一个变量的时候, 总是要为一个变量指定他的类型 甚至在fore ...

  5. 30分钟LINQ教程 【转载】

    原文地址:http://www.cnblogs.com/liulun/archive/2013/02/26/2909985.html 在说LINQ之前必须先说说几个重要的C#语言特性 一:与LINQ有 ...

  6. 正则表达式30分钟入门教程<转载>

    来园子之前写的一篇正则表达式教程,部分翻译自codeproject的The 30 Minute Regex Tutorial. 由于评论里有过长的URL,所以本页排版比较混乱,推荐你到原处查看,看完了 ...

  7. Objective-C 30分钟入门教程

    Objective-C 30分钟入门教程 我第一次看OC觉得这个语言的语法有些怪异,为什么充满了@符号,[]符号,函数调用没有()这个,但是面向对象的高级语言也不外乎类,接口,多态,封装,继承等概念. ...

  8. Oracle教程之学习笔记

    Oracle教程之学习笔记... ----------------------------------- Oracle教程:---学习笔记: ============================= ...

  9. PHP正则表达式30分钟入门教程

    正则表达式30分钟入门教程 三个常用的知识点: 1.惰性匹配:正则引擎默认是贪婪的,若要最少重复的话,需要用到惰性匹配符 “?” 懒惰限定符 代码/语法 说明 *? 重复任意次,但尽可能少重复 +? ...

随机推荐

  1. Shell记录-Shell脚本基础(一)

    Shell 注释: 你可以把注释,在你的脚本如下: #!/bin/bash # Author : Zara Ali # Copyright (c) Tutorialsyiibai.com # Scri ...

  2. 调用weka模拟实现 “主动学习“ 算法

    主动学习: 主动学习的过程:需要分类器与标记专家进行交互.一个典型的过程: (1)基于少量已标记样本构建模型 (2)从未标记样本中选出信息量最大的样本,交给专家进行标记 (3)将这些样本与之前样本进行 ...

  3. SQL语句(十八_补充)——存储过程

    一. 变量 1. 形式: @x (局部), @@x(全局) 2. 定义: declare @x 3. 赋值:Set @x = ? 4. 作用: 通用化 存储在服务器 5. 存储过程(预编译过的T-SQ ...

  4. Java 避免精度丢失之BigDecimal 运算

    * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精确的浮点数运算,包括加减乘除和四舍五入 import java.math.BigDecimal; /** 计算工具类 */ pu ...

  5. spring——获取ClassLoader

    org.springframework.util包下的ClassUtils类有个静态方法:getDefaultClassLoader() 可以获取当前类加载器,如下: public static Cl ...

  6. C语言入门教程-(1)简介及搭建环境

    1.谁适合阅读本教程 本教程可以帮助大家从零开始学习C语言,对于有一定基础的人起到夯实基本功的作用.C语言容易学习,非常适合初学者入门,而且也为以后的编程打下基础.借用一句话:“要进入编程行业高手必学 ...

  7. [NOIP提高&洛谷P1024]一元三次方程求解 题解(二分答案)

    [NOIP提高&洛谷P1024]一元三次方程求解 Description 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约 ...

  8. HDU 1256 画8 模拟题

    解题报告:这题我觉得题目有一个没有交代清楚的地方就是关于横线的字符的宽度的问题,题目并没有说,事实上题目要求的是在保证下面的圈高度不小于上面的圈的高度的情况下,横线的宽度就是等于下面的圈的高度. #i ...

  9. python 操作 memcache

    目录 Memcached Memcached安装 python操作Memcached Memcache模块常用方法 Memcached Memcached是一个高性能的分布式内存对象缓存系统,用于动态 ...

  10. win10+anaconda虚拟环境python3.6+cuda9.0+cudnn7+pytorch0.4.1

    anaconda下jupyter notebook的打开目录的修改:参考:https://www.cnblogs.com/amberdata/p/7907845.html pytorch官网:http ...