LINQ是什么?
LINQ是Language Integrated Query(语言集成查询的缩写), 微软官方 对其的描述:
语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称。
基本用法是什么?
(我目前也只会最基本的用法。。)
LINQ查询操作由三个不同的操作组成:
- 获取数据源
- 创建查询
- 执行查询
下面我将用我学习时用的一个小例子来演示。
有两个数据源:武林高手的集合和武林绝学的集合。
我用的是两个集合,实际上不只是集合可以作为数据源
微软官方文档提到:
上例中,数据源是一个数组,因此它隐式支持泛型IEnumerable<T> 接口。 这一事实意味着该数据源可以用 LINQ 进行查询。
说回我的例子,我实现了两个类:
MatialArtsMaster 表示武林高手:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
//武林高手 class MatialArtsMaster { public int ID { get ; set ; } public string Name { get ; set ; } public int Age { get ; set ; } public string Menpai { get ; set ; } public string Kongfu { get ; set ; } public int Level { get ; set ; } public override string ToString() { return string .Format( "id:{0},name:{1},age:{2},menpai:{3},kongfu:{4},level:{5}" , this .ID, this .Name, this .Age, this .Menpai, this .Kongfu, this .Level); } } |
Kongfu 表示武林绝学:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
//武学 class Kongfu { public int Id { get ; set ; } public string Name { get ; set ; } public int Power { get ; set ; } public Kongfu() { } public Kongfu( int id, string name, int power) { Id = id; Name = name; Power = power; } public override string ToString() { return string .Format( "Id:{0},Name:{1},Power:{2}" , this .Id, this .Name, this .Power); } } |
然后填充两个集合:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
{ var MasterList = new List<MatialArtsMaster> { new MatialArtsMaster(){ID=001,Name= "黄蓉" ,Age=18,Menpai= "丐帮" ,Kongfu= "打狗棒法" ,Level=9}, new MatialArtsMaster(){ID=002,Name= "洪七公" ,Age=70,Menpai= "丐帮" ,Kongfu= "打狗棒法" ,Level=10}, new MatialArtsMaster(){ID=003,Name= "郭靖" ,Age=22,Menpai= "丐帮" ,Kongfu= "降龙十八掌" ,Level=10}, new MatialArtsMaster(){ID=004,Name= "任我行" ,Age=50,Menpai= "明教" ,Kongfu= "葵花宝典" ,Level=1}, new MatialArtsMaster(){ID=005,Name= "东方不败" ,Age=35,Menpai= "明教" ,Kongfu= "葵花宝典" ,Level=10}, new MatialArtsMaster(){ID=006,Name= "林平之" ,Age=23,Menpai= "华山" ,Kongfu= "葵花宝典" ,Level=7}, new MatialArtsMaster(){ID=007,Name= "岳不群" ,Age=50,Menpai= "华山" ,Kongfu= "岳不群" ,Level=8}, new MatialArtsMaster(){ID=008,Name= "令狐冲" ,Age=23,Menpai= "华山" ,Kongfu= "独孤九剑" ,Level=10}, new MatialArtsMaster(){ID=009,Name= "梅超风" ,Age=23,Menpai= "梅花岛" ,Kongfu= "九阴真经" ,Level=8}, }; var kungfuList = new List<Kongfu>() { new Kongfu(){Id=1,Name= "打狗棒法" ,Power=90}, new Kongfu(){Id=2,Name= "降龙十八掌" ,Power=95}, new Kongfu(){Id=3,Name= "葵花宝典" ,Power=100}, new Kongfu(){Id=4,Name= "独孤九剑" ,Power=100}, new Kongfu(){Id=5,Name= "九阴真经" ,Power=100}, }; |
接下来就是查询了,基本的LINQ查询操作主要通过 from , in , select , where 关键字实现。例如:
查询修炼 葵花宝典 的武林高手:
1
2
3
4
5
6
7
8
9
10
|
var res = from master in MasterList where master.Kongfu == "葵花宝典" select master; foreach (var temp in res) { Console.WriteLine(temp.ToString()); } //id: 4,name: 任我行,age: 50,menpai: 明教,kongfu: 葵花宝典,level: 1 //id: 5,name: 东方不败,age: 35,menpai: 明教,kongfu: 葵花宝典,level: 10 //id: 6,name: 林平之,age: 23,menpai: 华山,kongfu: 葵花宝典,level: 7 |
查询所有武林高手的名字:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
var res = from master in MasterList select master.Name; foreach (var temp in res) { Console.WriteLine(temp.ToString()); } //黄蓉 //洪七公 //郭靖 //任我行 //东方不败 //林平之 //岳不群 //令狐冲 //梅超风 |
微软官方将 from 关键字后的那个变量称为 范围变量 :
范围变量就像 foreach 循环中的迭代变量,但查询表达式中不会真正发生迭代。 当执行查询时,范围变量将充当对 customers 中每个连续的元素的引用。
这种写法写起来和SQL语句十分相似,逻辑功能也基本上一样,所以如果已经会SQL的话会很容易理解。
扩展方法
除了这样的标准写法,还可以通过数据源的扩展方法来实现LINQ查询。最简单易懂的一个方法是 where() 方法。
如要查询所有修炼等级大于8的武林高手:
1
2
3
4
5
6
7
8
9
10
|
var res = MasterList.Where(master => master.Level > 8); foreach (var temp in res) { Console.WriteLine(temp.ToString()); } //id: 1,name: 黄蓉,age: 18,menpai: 丐帮,kongfu: 打狗棒法,level: 9 //id: 2,name: 洪七公,age: 70,menpai: 丐帮,kongfu: 打狗棒法,level: 10 //id: 3,name: 郭靖,age: 22,menpai: 丐帮,kongfu: 降龙十八掌,level: 10 //id: 5,name: 东方不败,age: 35,menpai: 明教,kongfu: 葵花宝典,level: 10 //id: 8,name: 令狐冲,age: 23,menpai: 华山,kongfu: 独孤九剑,level: 10 |
扩展方法还有很多,如 Select 、 SelectMany 、 Join 和 Orderby 。他们的具体用法可参阅微软官方文档-扩展方法
)。
最后
LINQ是一项强大的技术,我才了解了一点点LINQ的知识(甚至可能还有错误,如果有请一定指正!),保持学习才是长久之道。
总结
到此这篇关于C# LINQ的基本使用方法的文章就介绍到这了,更多相关C# LINQ基本用法内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://segmentfault.com/a/1190000023528961