本篇简单回顾C#语言集合操作的变化,通过与Linq对等的面向对象的语法来认识Linq。
Linq是Language Integrated Query, 初识Linq感觉跟SQL Server的Tsql很像,可以进行语言必备的逻辑操作,也可以实现对集合的直接查询。

Net1.X时代
C#不支持泛型,集合用元素只能为object类型的ArrayList等。
添加、取出元素都与Object类型进行强制类型转换,
如果是值类型要进行装箱操作,取出元素时进行拆箱操作,影响效率,
编译时不进行类型检查,类型不匹配运行时可能出错。
定义实体类:
public class Employee 

    private string _Name; 
    private int _Age; 
    private string _Phone;

public string Name 
    { 
        get { return _Name; } 
        set { _Name = value; } 
    }

public int Age 
    { 
        get { return _Age; } 
        set { _Age = value; } 
    }

public string Phone 
    { 
        get { return _Phone; } 
        set { _Phone = value; } 
    }

public Employee(string name, int age, string phone) 
    { 
        _Name = name; 
        _Age = age; 
        _Phone = phone; 
    } 
}

初识化集合:
这进行类型转换。

ArrayList list; 
list = new ArrayList(); 
list.Add(new Employee("Zxjay", 20, "010-123456")); 
list.Add(new Employee("Andy", 30, "020-123456")); 
list.Add(new Employee("Bill", 50, "010-3456789")); 
list.Add(new Employee("Lee", 40, "0532-234567"));

排序:
需实现IComparer接口。

class SortArrayList : IComparer 

    public int Compare(object x, object y) 
    { 
        Employee a = x as Employee; 
        Employee b = y as Employee;

return a.Name.CompareTo(b.Name); 
    } 
}

list.Sort(new SortArrayList());

遍历每个元素取得符合条件的元素放到新的集合:
这里也进行类型转换。

ArrayList selectedList = new ArrayList();

foreach (object obj in list) 

    Employee emp = obj as Employee;

if (emp != null && emp.Phone.StartsWith("010") && emp.Age < 50) 
    { 
        selectedList.Add(emp); 
    } 
}

输出集合元素:
这里也进行类型转换。

private void ShowList(ArrayList list) 

    Console.WriteLine("{0,-20:G}{1,-5:G}{2}", "Name", "Age", "Phone");

foreach (object obj in list) 
    { 
        Employee emp = obj as Employee;

if (emp != null) 
        { 
            Console.WriteLine("{0,-20:G}{1,-5:G}{2}", emp.Name, emp.Age, emp.Phone); 
        } 
    } 
}

.NET 2.0时代
加入了泛型和匿名方法,代码量减少,逻辑清晰了许多,编译期间强类型检查和去掉了强制类型转换及装箱、拆箱操作。
定义实体类跟.NET 1.1时代一样。
排序选择直接用匿名方法实现:

list.Sort( 
    delegate(Employee x, Employee y) 
    { 
        return x.Name.CompareTo(y.Name); 
    } 
    );

List<Employee> listBeijing = list.FindAll( 
    delegate(Employee emp) 
    { 
        return emp.Phone.StartsWith("010") && emp.Age < 50; 
    } 
    );

输出集合元素:
这里去掉了强制类型转换。

private void ShowList(IList<Employee> list) 

    Console.WriteLine("{0,-20:G}{1,-5:G}{2}", "Name", "Age", "Phone");

foreach (Employee emp in list) 
    { 
        Console.WriteLine("{0,-20:G}{1,-5:G}{2}", emp.Name, emp.Age, emp.Phone); 
    } 
}

.Net 3.X时代
自动属性、扩展方法、隐含类型、匿名类型、类型集合初识化器、Lambda表达式,有大大简化了编程复杂度。
定义实体类:
用自动属性。
public class Employee 

    public string Name { get; set; } 
    public int Age { get; set; } 
    public string Phone { get; set; } 
}

初始化集合:
list = new List<Employee> 

    new Employee{ Name = "Zxjay", Age = 20, Phone = "010-123456" }, 
    new Employee{ Name = "Andy", Age = 30, Phone = "020-123456" }, 
    new Employee{ Name = "Bill", Age = 50, Phone = "010-345678" }, 
    new Employee{ Name = "Lee", Age = 40, Phone = "010-234567" } 
};

排序选择:
用Lambda表达式实现:
list.Sort((Employee x, Employee y) => { return x.Name.CompareTo(y.Name); }); 
var listBijing = list.FindAll( 
    (Employee emp) => { return emp.Phone.StartsWith("010") && emp.Age < 50; });

输出集合元素:
用扩展方法。
private void ShowList(List<Employee> list) 

    Console.WriteLine("{0,-20:G}{1,-5:G}{2}", "Name", "Age", "Phone");

list.ForEach((Employee emp) => Console.WriteLine("{0,-20:G}{1,-5:G}{2}", emp.Name, emp.Age, emp.Phone)); 
}

这些查询大大简化,但这些还是面向对象的方法。
Linq这样实现排序选择等操作:
var selectResult = from emp in list 
                   where emp.Phone.StartsWith("010") && emp.Age < 50 
                   orderby emp.Name 
                   select emp;

这才是真正意义上的语言集成查询,是不是似曾相识?跟SQL语句相似,只是把select字句放在最后。
本篇仅仅是对Linq的概述及语言内集合查询机制的变化的概要介绍,Linq的内容将在下面的内容一步一步展开。

Linq 学习(1) 概述的更多相关文章

  1. Linq学习工具及Lamada表达式

    好东西.转载一个.以备学习 Linq学习工具:     http://www.linqpad.net/ Lamada表达式: Func<int, int, int> IntPow = (x ...

  2. linq学习

    最全的linq学习文章: http://www.cnblogs.com/heyuquan/p/Linq-to-Objects.html

  3. (转)Linq学习笔记

    写在前面 最近在看Linq,在博客园看到这篇文章,写的通俗易懂,转来和大家一起做个分享.原文地址http://www.cnblogs.com/goscan/archive/2011/05/05/Lin ...

  4. C#之Linq学习笔记【转】

    写在前面 其实在09年就已经学习过Linq了,并被她那优美的语法所吸引,只是现在所在的公司还在使用VS2005在.Net2.0的框架下面的开发,所以Linq也很久没有用过了,最近看部门的同事对这个有些 ...

  5. LINQ to XML LINQ学习第一篇

    LINQ to XML LINQ学习第一篇 1.LINQ to XML类 以下的代码演示了如何使用LINQ to XML来快速创建一个xml: public static void CreateDoc ...

  6. LINQ学习系列-----1.3 扩展方法

    这篇内容继续接着昨天的Lambda表达式的源码继续下去.昨天讲了Lambda表达式,此篇讲扩展方法,这两点都是Linq带来的新特性.    一.扩展方法介绍   废话不多说,先上源码截图: 上图中Ge ...

  7. LINQ学习系列-----2.3 迭代器带来的延迟查询

    此篇博文承接上一篇博文: LINQ学习系列-----2.2 迭代器 一.第一次执行                      废话不多说,上源码: 执行结果下图: 为什么会这样?其实原因很简单 fro ...

  8. Linq学习以及简单用法

    Linq学习 Linq(language Intergrated Query)即语言集成查询 LINQ是一组语言特性和API,使得你可以使用统一的方式编写各种查询.用于保存和检索来自不同数据源的数据, ...

  9. C# LINQ学习笔记二:LINQ标准查询操作概述

    本笔记摘抄自:https://www.cnblogs.com/liqingwen/p/5801249.html,记录一下学习过程以备后续查用. “标准查询运算符”是组成语言集成查询 (LINQ) 模式 ...

随机推荐

  1. 【转】Qt 事件处理机制 (下篇)

    转自:http://mobile.51cto.com/symbian-272816.htm 在Qt中,事件被封装成一个个对象,所有的事件均继承自抽象类QEvent. 接下来依次谈谈Qt中有谁来产生.分 ...

  2. Qt5中QMessageBox::warning()的第一个参数写this时出错

    StandardButton QMessageBox::warning ( QWidget * parent, const QString & title, const QString &am ...

  3. 由setTimeout()里的this引出的this

    example 1: window.id='windowid'; function M(){ this.id='Mid'; this.f1=function(){console.log(this.id ...

  4. 转载:Java连接MySQL 数据库的正确操作流程

    转载网址:http://www.bitscn.com/pdb/mysql/201005/186551.html       以下的文章主要介绍的是Java连接MySQL 数据库(以MySQL数据库为例 ...

  5. 查看文件系统类型的Linux命令

    不需挂载就能查看的命令:   1. file  [root@localhost dev]# file -s /dev/sda1 /dev/sda1: Linux rev 1.0 ext4 filesy ...

  6. d039: 点的位置

    内容: 已知一平面直角坐标系中正方形的左上(-2,2)和右下(2,-2)的顶点坐标,,当给一个点的坐标,判断点和正方形的关系,在正方形内(含边上)输出True ,否则输出 False 输入说明: 一行 ...

  7. Hive是什么!

    Hive是什么! 一直想抽个时间整理下最近的所学,断断续续接触hive也有半个多月了,大体上了解了很多Hive相关的知识.那么,一般对陌生事物的认知都会经历下面几个阶段: 为什么会出现?解决了什么问题 ...

  8. 01 - 概述 VTK 6.0 迁移

    摘要 对vtk版本4和5的管道机制重新架架构的主要目的是:迁移数据对象和算法对象中的管道执行逻辑到一个新集合的类中,我们称这个集合类叫executives.分离数据和执行模型的代码后,可以双双简化修改 ...

  9. 转:MFC文件操作

    讲到文件操作我们会联想到自己手动操作文件会涉及到哪些内容.很容易想到的是查看文件(文件夹)是否存在,创建,复制,删除,剪切文件(文件夹).另外就是设置文件的属性. 那MFC中一些操作文件的类也差不多是 ...

  10. Linq中join & group join & left join 的用法

    Linq中join & group join & left join 的用法 2013-01-30 11:12 12154人阅读 评论(0) 收藏 举报  分类: C#(14)  文章 ...