30分钟LINQ教程的学习笔记

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

一、11个与LINQ有关的语言特性

1. 隐式类型 var num = 1;
2. 匿名类型 var obj = new {id=1,name="aa"};
3. 自动属性
    public string Title {get; set;}
4. 对象初始化器
    var myObj = new MyObj(){id=1, name="aa"};
5. 委托:委托是一种类型
    delegate bool MoreOrLessDelgate(int item);

    委托类型,和类是一个级别的,它定义了某种方法规范。
    委托对象,和对象是同级别的,它指向某个方法。
    委托对象在使用时,实际上调用的是它指向的方法。
6. 泛型:避免装箱拆箱操作时的类型转化的性能损耗。
    预定义的泛型类型
        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() //必须有一个构造函数

7. 泛型委托
    预定义的三种泛型委托
        public delegate bool Predicate<in T>(T obj);//传入一个T类型的参数,返回bool类型的值

        public delegate void Action<in T1...T16>(T1 obj1, ..16)//传入0个到16个参数,无返回值
        public delegate TResult Func<in T1...T16, TResult>(T1 obj1, ..16)//传入0个到16个参数,返回一个T类型值

8. 匿名方法:delegate (int item){方法体};
    var print = new Action<int>(delegate(int a){Console.WriteLine(a);});
    其中,匿名方法代码如下:
            delegate(int a){Console.WriteLine(a);}

9. 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语句

10. 扩展方法
    想给一个类型增加行为,通常是通过继承的方式实现。
    新的方式是使用扩展方法。

    public static void PrintString(this String val)
    {
        Console.WriteLinie(val);
    }

    之后,则可以这样调用。
    var a = "aaa;
    a.PrintString();

    本来string类型没有PrintString方法。
    但通过我们上面的代码,就给string类型"扩展"了一个PrintString方法

    
    (1)先决条件
     <1>扩展方法必须在一个非嵌套、非泛型的静态类中定义
     <2>扩展方法必须是一个静态方法
     <3>扩展方法至少要有一个参数【这个参数的类型就是增加行为的类型】
     <4>第一个参数必须附加this关键字作为前缀
     <5>第一个参数不能有其他修饰符(比如ref或者out)
     <6>第一个参数不能是指针类型
    (2)注意事项
     <1>跟前面提到的几个特性一样,扩展方法只会增加编译器的工作,不会影响性能(用继承的方式为一个类型增加特性反而会影响性能)
     <2>如果原来的类中有一个方法,跟你的扩展方法一样(至少用起来是一样),那么你的扩展方法奖不会被调用,编译器也不会提示你
     <3>扩展方法太强大了,会影响架构、模式、可读性等等等等....

11. 迭代器
    每次针对集合类型编写foreach代码块,都是在使用迭代器
    这些集合类型都实现了IEnumerable接口,都有一个GetEnumerator方法。
        static IEnumerable<int> GetIterator()
        {
            Console.WriteLine("迭代器返回了1");
            yield return 1;
            Console.WriteLine("迭代器返回了2");
            yield return 2;
            Console.WriteLine("迭代器返回了3");
            yield return 3;
        }
    yield 关键字,在迭代器块中用于向枚举数对象提供值或发出迭代结束信号。

    注意事项
    <1>做foreach循环时多考虑线程安全性      
     在foreach时不要试图对被遍历的集合进行remove和add等操作
     任何集合,即使被标记为线程安全的,在foreach的时候,增加项和移除项的操作都会导致异常
     (我在这里犯过错)
    <2>IEnumerable接口是LINQ特性的核心接口
     只有实现了IEnumerable接口的集合
     才能执行相关的LINQ操作,比如select,where等
     这些操作,我们接下来会讲到。
时间: 2024-08-11 07:37:40

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

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

本文转自:http://www.cnblogs.com/liulun/archive/2013/02/26/2909985.html 千万别被这个页面的滚动条吓到!!! 我相信你一定能在30分钟之内看完它!!! 在说LINQ之前必须先说说几个重要的C#语言特性 一:与LINQ有关的语言特性 1.隐式类型 (1)源起 在隐式类型出现之前, 我们在声明一个变量的时候, 总是要为一个变量指定他的类型 甚至在foreach一个集合的时候, 也要为遍历的集合的元素,指定变量的类型 隐式类型的出现, 程序员

30分钟LINQ教程

在说LINQ之前必须先说说几个重要的C#语言特性 一:与LINQ有关的语言特性 1.隐式类型 (1)源起 在隐式类型出现之前, 我们在声明一个变量的时候, 总是要为一个变量指定他的类型 甚至在foreach一个集合的时候, 也要为遍历的集合的元素,指定变量的类型 隐式类型的出现, 程序员就不用再做这个工作了. (2)使用方法   来看下面的代码: var a = 1; //int a = 1; var b = "123";//string b = "123"; va

【转】30分钟LINQ教程

原文地址 在说LINQ之前必须先说说几个重要的C#语言特性 一:与LINQ有关的语言特性 1.隐式类型 (1)源起 在隐式类型出现之前, 我们在声明一个变量的时候, 总是要为一个变量指定他的类型 甚至在foreach一个集合的时候, 也要为遍历的集合的元素,指定变量的类型 隐式类型的出现, 程序员就不用再做这个工作了. (2)使用方法   来看下面的代码: var a = 1; //int a = 1; var b = "123";//string b = "123"

30分钟LINQ教程(转)

在说LINQ之前必须先说说几个重要的C#语言特性 一:与LINQ有关的语言特性 1.隐式类型 (1)源起 在隐式类型出现之前, 我们在声明一个变量的时候, 总是要为一个变量指定他的类型 甚至在foreach一个集合的时候, 也要为遍历的集合的元素,指定变量的类型 隐式类型的出现, 程序员就不用再做这个工作了. (2)使用方法   来看下面的代码: var a = 1; //int a = 1; var b = "123";//string b = "123"; va

30分钟泛型教程

一.泛型入门: 我们先来看一个最为常见的泛型类型List<T>的定义(真正的定义比这个要复杂的多,我这里删掉了很多东西) [Serializable] public class List<T> : IList<T>, ICollection<T>, IEnumerable<T> { public T this[int index] { get; set; } public void Add(T item); public void Clear()

【转】正则表达式30分钟入门教程

首页 | 常用正则表达式 | 正则表达式测试工具 正则表达式30分钟入门教程 版本:v2.33 (2013-1-10) 作者:deerchao 转载请注明来源 目录 跳过目录 本文目标 如何使用本教程 正则表达式到底是什么东西? 入门 测试正则表达式 元字符 字符转义 重复 字符类 分枝条件 反义 分组 后向引用 零宽断言 负向零宽断言 注释 贪婪与懒惰 处理选项 平衡组/递归匹配 还有些什么东西没提到 联系作者 网上的资源及本文参考文献 更新纪录 本文目标 30分钟内让你明白正则表达式是什么,

HTML 30分钟入门教程

本文目标 30分钟内让你明白HTML是什么,并对它有一些基本的了解.一旦入门后,你可以从网上找到更多更详细的资料来继续学习. 什么是HTML HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,它规定了自己的语法规则,用来表示比"文本"更丰富的意义,比如图片,表格,链接等.浏览器(IE,FireFox等)软件知道HTML语言的语法,可以用来查看HTML文档.目前互联网上的绝大部分网页都是使用HTML编写的. HTML是什么样的 简单地来说,HT

正则表达式30分钟入门教程 都是复制的

正则表达式30分钟入门教程 来园子之前写的一篇正则表达式教程,部分翻译自codeproject的The 30 Minute Regex Tutorial. 由于评论里有过长的URL,所以本页排版比较混乱,推荐你到原处查看,看完了如果有问题,再到这里来提出. 一些要说的话: 如果你没有正则表达式的基础,请跟着教程“一步步来”.请不要大概地扫两眼就说看不懂——以这种态度我写成什么样你也看不懂.当我告诉你这是“30分钟入门教程”时,请不要试图在30秒内入门. 事实是,我身边有个才接触电脑,对操作都不是

python基础教程_学习笔记6:字典

字典 映射(mapping),一种可通过名字引用值得数据结构. 字典是python中唯一内建的映射类型. 字典中的值没有特殊的顺序,但都存储在一个特定的键(key)里.键可以是数字.字符串甚至是元组. 字典的使用 某些情况下,字典比列表更加适用,比如: 表征游戏棋盘的状态,每个键都是由坐标值组成的元组: 存储文件修改数,用文件名作为键: 数字电话/地址簿: 假如有一个人名列表如下: >>>names=['Alice','Beth','Cecil','Dee-Dee','Earl'] 如果