Linq 学习(1) 概述
本篇简单回顾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;
}
}
初识化集合:
这进行类型转换。
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接口。
{
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());
遍历每个元素取得符合条件的元素放到新的集合:
这里也进行类型转换。
foreach (object obj in list)
{
Employee emp = obj as Employee;
if (emp != null && emp.Phone.StartsWith("010") && emp.Age < 50)
{
selectedList.Add(emp);
}
}
输出集合元素:
这里也进行类型转换。
{
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时代一样。
排序选择直接用匿名方法实现:
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;
}
);
输出集合元素:
这里去掉了强制类型转换。
{
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) 概述的更多相关文章
- Linq学习工具及Lamada表达式
好东西.转载一个.以备学习 Linq学习工具: http://www.linqpad.net/ Lamada表达式: Func<int, int, int> IntPow = (x ...
- linq学习
最全的linq学习文章: http://www.cnblogs.com/heyuquan/p/Linq-to-Objects.html
- (转)Linq学习笔记
写在前面 最近在看Linq,在博客园看到这篇文章,写的通俗易懂,转来和大家一起做个分享.原文地址http://www.cnblogs.com/goscan/archive/2011/05/05/Lin ...
- C#之Linq学习笔记【转】
写在前面 其实在09年就已经学习过Linq了,并被她那优美的语法所吸引,只是现在所在的公司还在使用VS2005在.Net2.0的框架下面的开发,所以Linq也很久没有用过了,最近看部门的同事对这个有些 ...
- LINQ to XML LINQ学习第一篇
LINQ to XML LINQ学习第一篇 1.LINQ to XML类 以下的代码演示了如何使用LINQ to XML来快速创建一个xml: public static void CreateDoc ...
- LINQ学习系列-----1.3 扩展方法
这篇内容继续接着昨天的Lambda表达式的源码继续下去.昨天讲了Lambda表达式,此篇讲扩展方法,这两点都是Linq带来的新特性. 一.扩展方法介绍 废话不多说,先上源码截图: 上图中Ge ...
- LINQ学习系列-----2.3 迭代器带来的延迟查询
此篇博文承接上一篇博文: LINQ学习系列-----2.2 迭代器 一.第一次执行 废话不多说,上源码: 执行结果下图: 为什么会这样?其实原因很简单 fro ...
- Linq学习以及简单用法
Linq学习 Linq(language Intergrated Query)即语言集成查询 LINQ是一组语言特性和API,使得你可以使用统一的方式编写各种查询.用于保存和检索来自不同数据源的数据, ...
- C# LINQ学习笔记二:LINQ标准查询操作概述
本笔记摘抄自:https://www.cnblogs.com/liqingwen/p/5801249.html,记录一下学习过程以备后续查用. “标准查询运算符”是组成语言集成查询 (LINQ) 模式 ...
随机推荐
- Ubuntu 安装之后的配置博文总结
由于频繁地在各种机器上给别人安装ubuntu,每次安装之后都需要进行一些配置,现在以ubuntu12.04为例,就他人的一些配置博文总结如下: 1. Ubuntu安装中文输入法 http://www. ...
- C#中启动外部应用程序
C#中我们可以通过Process类直接启动外部应用程序 代码如下: Process p = new Process(); p.StartInfo.FileName ...
- PHP连续签到
require "./global.php"; $act = isset($_GET['act']) ? $_GET['act'] : "error"; // ...
- c++学习笔记和思考
1.内置类型:int float等编程语言自己定义的类型 类类型:自己声明的类,即是对对象的抽象 2.const double *cp 表示cp是指向一个const类型double类型数据的指针,而非 ...
- FMX手机app,如何下载网站图片而不卡界面
你用的版本? 你应该关注下delphi 更新说明第一方法: 可以用线程.第二方法: TNetHTTPClient 已经支持异步 TThread.CreateAnonymousThread( proce ...
- WPF 自己动手来做安装卸载程序
原文:WPF 自己动手来做安装卸载程序 前言 说起安装程序,这也许是大家比较遗忘的部分,那么做C/S是小伙伴们,难道你们的程序真的不需要一个炫酷的安装程序么? 声明在先 本文旨在教大家以自己的方式实现 ...
- Python socket 客户端和服务器端
connection, address = socket.accept() 调 用accept方法时,socket会时入“waiting”状态.客户请求连接时,方法建立连接并返回服务器.accept方 ...
- java日期int和String互转
/** * 时间unix转换 * @param timestampString * @return */ public static String TimeStampDate(String times ...
- Java中string拼接,StringBuilder,StringBuffer和+
Java中string拼接,StringBuilder,StringBuffer和+,到底哪个更合适? StringBuilder线程不安全,效率较线程安全的StringBuffer高.jdk1.5之 ...
- C++中的string类(2)
相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯 ...