快捷搜索:

LINQ入门教程(二)

1LINQ TO Objects续(代码下载)

新建项目 linq_Ch2节制台法度榜样,新建一个Entity文件夹

1.1 门生成就查询(演习Join)

有三张表如下:门生表,班级表,成就表。接下来我们按照这个在Entity文件夹建立3个实体类,类名跟表名一样。

using System;

using System.Collections.Generic;using System.Linq;

using System.Text;

namespace linq_Ch2.Entity{

public class Student{

////// 门生编号

///public int StuId { get; set; }

////// 门生姓名

///public string StuName { get; set; }

///

/// 班级ID///

public int ClassId { get; set; }

////// 班级

///public Classroom Classrooms { get; set; }

}

}

using System;

using System.Collections.Generic;using System.Linq;

using System.Text;

namespace linq_Ch2.Entity{

public class Classroom{

////// 班级Id

///public int ClassId { get; set; }

////// 班级名称

///public string ClassName { get; set; }

}

}using System;

using System.Collections.Generic;using System.Linq;

using System.Text;

namespace linq_Ch2.Entity{

public class Score{

////// 分数Id

///public int ScoreId { get; set; }

////// 学科名称

///public string ItemName { get; set; }

////// 门生ID

///public int StuId { get; set; }

////// 门生

///public Student Students { get; set; }

////// 分数

///public double Scores { get; set; }

}}

如上,3个实体类创建好了

①查询出门生名 学科分数3列信息

首先我们初始化一点数据,在void main措施中写

List students = new List {

new Student{StuId=1,StuName="钱一",ClassId=1},new Student{StuId=2,StuName="赵二",ClassId=1},

new Student{StuId=3,StuName="张三",ClassId=2},new Student{StuId=4,StuName="李四",ClassId=1},

new Student{StuId=5,StuName="王五",ClassId=3},new Student{StuId=6,StuName="陈六",ClassId=2},

new Student{StuId=7,StuName="田七",ClassId=3}};

List scores = new List {new Score{ScoreId=1,ItemName="语文",StuId=1,Scores=56},

new Score{ScoreId=2,ItemName="语文",StuId=2,Scores=65},new Score{ScoreId=3,ItemName="语文",StuId=3,Scores=37},

new Score{ScoreId=4,ItemName="数学",StuId=1,Scores=33},new Score{ScoreId=5,ItemName="数学",StuId=2,Scores=77},

new Score{ScoreId=6,ItemName="数学",StuId=3,Scores=84},new Score{ScoreId=7,ItemName="英语",StuId=1,Scores=133},

new Score{ScoreId=8,ItemName="英语",StuId=2,Scores=53},new Score{ScoreId=9,ItemName="英语",StuId=3,Scores=42},

new Score{ScoreId=10,ItemName="英语",StuId=4,Scores=33},new Score{ScoreId=11,ItemName="数学",StuId=7,Scores=127}

};List classrooms = new List {

new Classroom{ClassId=1,ClassName="高三(1)班"},new Classroom{ClassId=2,ClassName="高三(2)班"},

new Classroom{ClassId=3,ClassName="高三(3)班"}};

开始查询,用聚拢.Join(另一个聚拢,第一个聚拢的前提列,第二个聚拢的前提列,怎么处置惩罚(一个措施))

//门生名 学科分数

var query1 = students.Join(scores,//另一个聚拢

stu=>stu.StuId,//建立关系stu.StuId=sc.StuIdsc=>sc.StuId,

(s,sc)=>new {//选出要的数据门生姓名=s.StuName,

学科=sc.ItemName,分数=sc.Scores

});

Console.WriteLine("门生姓名\t学科\t\t分数");foreach (var stu in query1)

{Console.WriteLine(string.Format("{0}\t\t{1}\t\t{2}",stu.门生姓名,stu.学科,stu.分数));

}

效果图

第二种要领:

var query2 = from a in students

join b in scoreson a.StuId equals b.StuId

select new{

门生姓名 = a.StuName,学科 = b.ItemName,

分数 = b.Scores};

Console.WriteLine("要领二");

Console.WriteLine("门生姓名\t学科\t\t分数");foreach (var stu in query1)

{Console.WriteLine(string.Format("{0}\t\t{1}\t\t{2}", stu.门生姓名, stu.学科, stu.分数));

1}

②算门生的总分,查出 门生名总分

// 门生名总分(假如分数表找不到,就算0分)

var query3 = from c in query2group c by c.门生姓名 into stuInfo

select new{

门生姓名 = stuInfo.Key,门生总分 = stuInfo.Sum(x => x.分数)

};Console.WriteLine("求总分的案例");

Console.WriteLine("门生姓名\t总分");foreach (var stu in query3)

{Console.WriteLine(string.Format("{0}\t\t{1}", stu.门生姓名, stu.门生总分));

}

效果图:

③左查询(用join实现),DefaultIfEmpty后面括号中的参数是默认值,以students为主表,scores为副表,主表的信息全显示,副表只显示匹配门生Id相同的。

(假如分数表找不到,就算0分)

Console.WriteLine("左查询要领");

var query5 = from a in studentsjoin b in scores

on a.StuId equals b.StuIdinto pGroup

from pItem in pGroup.DefaultIfEmpty(new Score { Scores=0,ItemName="没参考",StuId=a.StuId,ScoreId=0})select new

{门生姓名 = a.StuName,

学科 = pItem.ItemName,分数 = pItem.Scores

};Console.WriteLine("门生姓名\t学科\t\t分数");

foreach (var stu in query5){

Console.WriteLine(string.Format("{0}\t\t{1}\t\t{2}", stu.门生姓名, stu.学科, stu.分数));}

效果图:

假如是数据库,则等同于SQL语句

select s.StuId,s.StuName,s.ClassID,isnull(sc.ScoreId,0),isnull(sc.itemName,'没参考'),isnull(sc.stuID,0),isnull(sc.score,0) from dbo.Student s left join dbo.Score sc on s.StuID=sc.stuID

④交叉查询

效果图:

代码:

Console.WriteLine("交叉查询要领");

var query6 = from a in studentsfrom b in scores

select new{

门生姓名 = a.StuName,学科 = b.ItemName,

分数 = b.Scores};

Console.WriteLine("门生姓名\t学科\t\t分数");foreach (var stu in query6)

{Console.WriteLine(string.Format("{0}\t\t{1}\t\t{2}", stu.门生姓名, stu.学科, stu.分数));

}

等同于SQL:

select * from Student,Score

1.2 类型转换操作

①将数据源转换为IEnumerable类型,应用AsEnumerable措施

②将数据源转换为IQueryable类型,应用AsQueryable措施,用法同上

③将数据源转换成字典类型

代码如下:

//转换成Dictionary

Dictionaryint, Student> query9 = students.ToDictionary(i => i.StuId);Console.WriteLine(query9[0].StuName);

④应用Enumerable类的Cast措施,该措施将非泛型的IEnumerable类型转换为泛型的IEnumerable,至于转换成何种类型有Cast措施的TResult参数指定。

例如:

ArrayList arrList = new ArrayList();

for (int i = 0; i{

arrList.Add(i.ToString());}

var query10 = from i in arrList.Caststring>()where i.IndexOf("0") > -1

select i;foreach (var item in query10)

{Console.Write(item+",");

}Console.WriteLine();

效果图:

⑤应用 OfType 筛选指定类型的元素

代码如下:

//OfType

ArrayList arrList2 = new ArrayList();arrList2.Add(1);

arrList2.Add("茗洋");arrList2.Add("A");

arrList2.Add(3);arrList2.Add("dd");

var query11=from item in arrList2.OfTypestring>()select item;

foreach (var item in query11){

Console.Write(item+",");}

Console.WriteLine();

效果图:

⑥将数据源转换为List类型,应用ToList()措施,用法同IQueryable

⑦将数据源转换为数组类型,应用ToArray()措施,用法同IQueryable

⑧转换为一对多的字典Lookup,与Dictionary差别便是 相同key会对应多个值

下面我们 把班级作为key列出来,然后列出班级里面的门生

var query12=from o in students

join c in classroomson o.ClassId equals c.ClassId

select new Student{StuId=o.StuId,

StuName=o.StuName,ClassId=o.ClassId,

Classrooms=new Classroom{ClassId=c.ClassId,

ClassName=c.ClassName}

};

ILookupstring, Student> query13 = query12.ToLookup(f => f.Classrooms.ClassName);foreach (var item in query13)

{Console.WriteLine(item.Key+"的门生如下");

foreach (var stu in item){

Console.Write(stu.StuName+",");}

Console.WriteLine();

效果图如下

1.3 操作聚拢

1. 应用字符串的 EndsWith或者StartsWith过滤,应用CompareTo对照字符串的大年夜小()

例如:找出以“张”开首的门生姓名

//StartWith

var query14 = from o in query2where o.门生姓名.StartsWith("张")

select o;foreach (var item in query14)

{Console.Write(item.门生姓名+",");

}Console.WriteLine();

效果图:

此中query2可所以 很多,例如List,string[],IQueryable等

2. 操作泛型作排序列表SortList

SortList表示按照键进行排序的键/值对的聚拢,键/值对是KeyValuePair

//SortList

SortedListint, Student> users = new SortedListint, Student>{

{2,new Student{StuId=2,StuName="钱一",ClassId=1}},{12,new Student{StuId=12,StuName="赵二",ClassId=1}},

{1,new Student{StuId=1,StuName="张三",ClassId=2}},};

Console.WriteLine("未按门生姓名排序前的结果如下:");foreach (var item in users)

{Console.Write("键"+item.Key + ":"+item.Value.StuName);

}var query15 = from s in users

orderby s.Value.StuName descendingselect s;

Console.WriteLine();Console.WriteLine("按门生姓名排序后的结果如下:");

foreach (var item in query15){

Console.Write("键" + item.Key + ":" + item.Value.StuName);}

效果图

3. 操作泛型双向链表LinkedList

泛型双向列表LinkedList表示由T指定类型的双向链表,它经由过程当前元素可以直接造访该元素的前一个或者后一个元素(假如不存在返回空),元素为LinkedListNode类型

效果图:

代码:

Console.WriteLine();

//LinkedListLinkedListint> ints2 = new LinkedListint>();

ints2.AddFirst(0);for (int i = 1; i

{ints2.AddAfter(ints2.Find(i-1),i);

}//应用Linq过滤,排序泛型双向链表

var query16 = from item in ints2where item > 0 && item

orderby item descendingselect item;

//显示结果foreach (var item in query16)

{Console.Write(item.ToString()+",");

}

另一种要领:

Console.WriteLine();

var query17 = ints2.Where(x => x > 0 && xx);//显示结果

foreach (var item in query16){

Console.Write(item.ToString() + ",");}

4. 操作泛型行列步队Queue

先辈先出的线性表,应用Enqueue措施进行元素入队(添加)操作,应用Dequeue措施进行元素出队(删除)操作;应用Clear措施进行清空行列步队操作。Queue类没有实现IEnumerable接口或IEnumerable接口,以是不能应用LINQ直接操作Queue类型的工具,可以应用Queue工具的Cast措施先把它转换为IEnumerable类型,然后在应用LINQ对齐操作

Console.WriteLine();

Queue queues = new Queue();queues.Enqueue(new Student { StuId=11,StuName="大年夜一",ClassId=1});

queues.Enqueue(new Student { StuId = 2, StuName = "大年夜二", ClassId = 1 });queues.Enqueue(new Student { StuId = 34, StuName = "大年夜三", ClassId = 2 });

queues.Enqueue(new Student { StuId = 4, StuName = "大年夜四", ClassId = 1 });var query18 = queues.OrderByDescending(x=>x.StuId);

//显示结果foreach (var item in query18)

{Console.Write(item.StuName + ",");

}

效果图:

假如是Queue先转换成IEnumerable,在LINQ操作

5. 操作泛型客栈Stack

落后先出的线性表,应用Push措施进行元素入栈(添加)操作,应用Dequeue措施进行元素出栈(删除)操作;应用Clear措施进行清空客栈操作。Stack类没有实现IEnumerable接口或IEnumerable接口,以是不能应用LINQ直接操作Queue类型的工具,可以应用Stack工具的Cast措施先把它转换为IEnumerable类型,然后在应用LINQ对齐操作

效果图:

代码:

Console.WriteLine();

Stack stacks = new Stack();stacks.Push(new Student { StuId = 11, StuName = "大年夜一", ClassId = 1 });

stacks.Push(new Student { StuId = 2, StuName = "大年夜二", ClassId = 1 });stacks.Push(new Student { StuId = 34, StuName = "大年夜三", ClassId = 2 });

stacks.Push(new Student { StuId = 4, StuName = "大年夜四", ClassId = 1 });var query19 = from s in stacks

where s.ClassId != 1 || s.StuId!=2select s;

//显示结果foreach (var item in query19)

{Console.Write(item.StuName + ",");

}

6. 操作泛型哈希集HashSet

后泛型哈希集HashSet是由T指定类型的基于聚拢的模型,泛型哈希集可以供给高机能的如并集,交集,补集等聚拢运算。泛型哈希集中的元素不能重复。泛型哈希集供给许多聚拢操作,如并集,交集,补集等。

代码:

1:/*HashSet*/

2:Console.WriteLine();3:HashSet hashsets = new HashSet {

4:new Student{StuId=1,StuName="钱一",ClassId=1},5:new Student{StuId=2,StuName="赵二",ClassId=1},

6:new Student{StuId=3,StuName="张三",ClassId=2},7:new Student{StuId=4,StuName="李四",ClassId=1},

8:new Student{StuId=5,StuName="王五",ClassId=3},9:new Student{StuId=6,StuName="陈六",ClassId=2},

10:new Student{StuId=7,StuName="田七",ClassId=3}11:};

12:hashsets.Add(new Student { StuId = 11, StuName = "大年夜一", ClassId = 1 });13://先按班级升序排序,再按姓名降序

14:var query20 = from s in hashsets15:orderby s.ClassId ascending, s.StuName descending

16:select s;17:

18://显示结果19:foreach (var item in query20)

20:{21:Console.Write(item.StuName + ",");

22:}

效果图:

7. 操作泛型字典Dictionary

键不能重复,值可重复,键不会自动排序

代码:query9是一个Dictionary类型的

1:Console.WriteLine();

2:var query21 = from o in query93:where o.Value.StuName.CompareTo("张") > 0 //门生姓名大年夜于“张”

4:orderby o.Key5:select o;

6:foreach (var item in query21)7:{

8:Console.WriteLine(item.Key + ":"+item.Value.StuName);9:}

效果图:

8. 操作泛型排序字典SortedDictionary

与Dictionary的差别:泛型排序字典对添加的元素自动按键进行排序,代码例如:SortDictionary c=new SortDictionary{…….}

9. 操作泛型通用聚拢Collection,跟List一样用就行了

10. 操作泛型绑定列表 BindingList

泛型绑定列表BindingList能够供给支持数据绑定的泛型聚拢,他供给了IBindingList接口的详细泛型实现,可以用作创建双向数据绑定机制的积累,还可以经由过程AddNew措施支持创建实例

跟List一样用就行了

转自:http://www.cnblogs.com/Fresh-Air/archive/2013/04/03/2997141.html

您可能还会对下面的文章感兴趣: