LINQ初体验(一)LINQ to Object
来源:互联网 发布:narcissu知乎 编辑:程序博客网 时间:2024/05/17 07:03
What‘s LINQ? Language Integrated Query 是也。说得再明白一些,这是编程语言的一种新特性,能够将数据查询语句集成到编程语言中。目前,LINQ支持的语言有C# 和 VB。
为啥会有LINQ,主要还是因为现在的数据格式越来越多,数据库、XML、数组、哈希表……每一种都有自己操作数据的方式,学起来费事费力。于是,就有了LINQ诞生的理由——以一种统一的方式操作各种数据源,减少数据访问的复杂性。
LINQ带来很多开发上的便利。首先,他可以利用Visual Studio这个强大的IDE(这话决不是吹,Visual Studio绝对是最好用的开发工具之一),至少用Visual Studio来写SQL语句,可以有智能感知了,比起从前用查询分析器写存储过程的感觉好多了!其次,它可以把数据当成一个对象来操作,即 Data == Object? 的问题。
LINQ目前可以对XML, Object, SQL做数据访问,今后还会有LINQ to Entity的功能。
说来惭愧,我也是刚刚才接触LINQ,先从最简单的开始吧,做一个LINQ to Object的例子,实现一个对数组的操作。这个例子套用了今年TechED中海洋兄讲的例子,在此声明。
在这个例子中,我会先通过GetMethods的方法,拿到string的所有方法,接下来,就看LINQ的厉害了,这里是选出所有非静态的方法签名。
MethodInfo[] methods = typeof(string).GetMethods();
var result = from m in methods
where m.IsStatic != true
select m.Name;
foreach (var r in result)
{
Console.WriteLine(r.ToString());
}
Console.ReadLine();
例子虽然简单,确能从中看出LINQ的一些端倪。首先,var是什么东东?
看起来,有点像javascript里面的弱类型的变量声明。但是,C#是强类型的,尽管你用var来声明,编译器还是可以根据上下文推倒出它当前的类型。比如这个例子里面,result就是IEnumerable<string> 类型的。在这里面,写IEnumerable<string>和写var是一样效果的,显然,var会简单得多。你不用考虑数据操作的返回值是什么类型,还能享受强类型声明带来的方便实惠……
还有from m in methods这句,m是什么东西,m是隐式声明的一个变量,尽管没有声明,但编译器根据上下文,推断出它的类型是MethodInfo型的!.NET Framework 3.5的编译器的确是聪明了很多 ^^
上面这个例子运行起来的结果中有很多重复的记录,我们可以用distinct()来过滤掉重复的,和SQL还是很相似的说。
var result = (from m in methods
where m.IsStatic != true
select m.Name).Distinct();
或者用group by 也可以
var result = from m in methods
where m.IsStatic != true
group m by m.Name;
但是这样子写,在输出的时候,显示的是 System.Linq.Lookup`2+Grouping[System.String,System.Reflection.MethodInfo],所以,再做一些修改
var result = from m in methods
where m.IsStatic != true
group m by m.Name into g
select new { MethodName = g.Key, Overload = g.Count() };
这里面又有一些新鲜的了——select new { MethodName = g.Key, Overload = g.Count() },先来看一个简单一些的例子:
class MyClass
{
public string MethodName { get; set; }
public int Overload { get; set; }
}
class Program
{
MyClass mc = new MyClass { MethodName = "aaa", Overload = 2 };
}
大括号里面的叫类初始化器,省去了构造函数,在new的同时,给对象的属性赋值。
这时候再回来看看select new { MethodName = g.Key, Overload = g.Count() },跟这个类初始化器很像吧,但是它更偷懒,new一个新对象,居然连类名都不写。没错,这就叫匿名类。不用写类的声明,直接实例化。类的名字是由编译器在编译的时候自动生成的,也就是说,你在new的时候根本不知道这个类叫啥名,因此,这里就只能用var了。这就更看出var的厉害了,不仅仅是写起来方便这么简单,在用到匿名类的时候,没有类名,这时候只能用var,嘿嘿!
- LINQ体验(一)LINQ to Object
- LINQ初体验(一)LINQ to Object
- LINQ初体验之LINQ to Object
- LINQ初体验之LINQ to Object
- LINQ to Object (一)
- LINQ体验(二)LINQ to XML
- LINQ能不能用系列(一)LINQ to Object 效率比对
- Linq to Object 深入理解(一):了解Linq之前的基础知识
- Linq to object ex
- LINQ TO OBJECT
- Linq to Object
- 【C#】Linq to Object
- Linq to Object
- Linq to Object
- LINQ to object
- Linq to Object
- Linq To Object(二)
- Linq to object
- 关于委托、事件、Invoke和BeginInvoke 的理解
- 注册表的一些操作介绍
- 任意形状窗体生成器(窗体有置顶效果)
- 增强for循环和泛型的使用
- linux下视频传输测试
- LINQ初体验(一)LINQ to Object
- dedecms横向滚动图片
- 国家税务总局:8月工资9月发放按3500元起征个税
- Lotus Enterprise Integrator (LEI) Administrator连接ODBC时报错"You Pressed Break.....(省略若干字)"解决方案
- 如何在wince6把内存从128M升级到256
- 【SHELL】基础二十篇
- 数据分析统计
- 提示功能封装
- define的一些小小理解