Linq How do I #1

Posted on 2007-07-03 10:57 Kenneth Byron 阅读(673) 评论(1)  编辑 收藏 所属分类: LINQ

LINQ,全称Language-Integrated Query,翻译过来是语言集成查询.那么作为系列的第一部分.我们先来看看到底如何用语言查询.首先我们看看传统方法:

int[] numbers = new int[10] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Console.Write("Evens in numbers are :");
foreach(int i in numbers)
{
if(i%2==0)
Console.Write(" "+i);
}
Console.Write("\n");

这里我们用传统的方法从一个数组中获取了所有偶数.下面我们试着查询一个对象数组.

public class Person
{
private string _Name;
private int _Age;
private char _Sex;

public Person(string name, int age, char sex)
{ this._Name = name; this._Age = age; this._Sex = sex; }

public string Name
{ get { return this._Name; } set { this._Name = value; } }
public int Age
{ get { return this._Age; } set { this._Age = value; } }
public char Sex
{ get { return this._Sex; } set { this._Sex = value; } }
}

Person[] people = new Person[]{
new Person("zhangsan",23,'M'),
new Person("lisi",24,'M'),
new Person("wangwu",25,'M')
};
Console.Write("Persons older than 23 are :");
foreach (Person p in people)
{
if (p.Age > 23)
Console.Write(" " + p.Name);
}
Console.Write("\n");

仔细观察以上的代码可以发现,其实在我们查询的时候经过了这么三个过程.
1. 获得数据源. foreach (Person p in people) 我们要筛选的数据来自一个Person对象数组.
2. 创建一个查询.
foreach (Person p in people)
{
if (p.Age > 23)
Console.Write(" " + p.Name);
}
查询的是Person对象数组中的每一个个对象,筛选条件为该对象的年龄要大于23.
3. 执行查询. foreach关键字负责执行枚举每一个Person中的p对象.

下面我们用三个关键字来分别定义以上三个步骤: 1. from(从) 2. where(满足) 3. select(选出).这样翻译是让一条程序语句更象我们平时的思维和表达方式.下面我们将上面的代码的代码用我们的语言表达一次.我们的目标是: 1.从名为people的Person数组中(from p in people),2.找出满足年龄大于23的人(where p.Age>23),3选择全部满足条件的人(select p).

IEnumerable query = from p in people
where p.Age > 23
select p;
Console.Write("Persons older than 23 are :");
foreach (Person p in query)
Console.Write(" " + p.Name);
Console.Write("\n");

这就是我们今天的How do I目标--完成一个查询.那么试着将第一个数字筛选代码自己写一下吧.
为什么这样就可以了呢?这个查询是怎么工作的?这些问题我会在In Depth #1中为大家解释.

最后给大家一个偷懒的代码,也是上面一个例子查询的答案.在给出代码前,我要跟大家交代一个关键字var.它是什么呢? var是C#3.0中的一个关键字,用来声明变量,当然var并不是一种数据类型它只表示接在它后面的是一个变量.而变量的数据类型由编译器根据代码的上下文推断获得.比如, var i = 20; 编译器在阅读这段代码时,首先得到变量i,这时编译器并不知道i是什么数据类型,接着编译器得到i的值20,因为20是int型,所以编译器定义i为int.在In Depth #1中.我也会为大家说明一下这个过程.好了,下面是在0-9的数组中查询所有双数的代码.

var numbers = new int[10] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var evens = from n in numbers
where n % 2 == 0
select n;
Console.Write("Evens in numbers are :");
foreach (var num in evens)
Console.Write(" " + num);
Console.WriteLine("\n");

朱宇
2007.7.3 Revised

Feedback

#1楼    回复  引用  查看    

2007-07-05 06:29 by 伍迷      
写得很通俗易懂。