1. 数据的初始化和LINQ的第一个基础使用

Kongfu Class

1
2
3
4
5
6
7
8
9
10
11
class KungFu
{
public int Id { get; set; }
public string Name { get; set; }
public int Power { get; set; }

public override string ToString()
{
return string.Format("Id:{0},Name:{1},Power{2}", Id, Name, Power);
}
}

MartialArtsMaster Class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/// <summary>
/// 武林高手
/// </summary>
class MartialArtsMaster
{
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}", Id, Name, Age, Menpai, Kongfu, Level);
}
}

Foreach查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
    internal class Program
{
private static void Main(string[] args)
{
//初始化武林高手
List<MartialArtsMaster> masterList = new List<MartialArtsMaster>()
{
new MartialArtsMaster() {Id = 1,Name = "黄蓉",Age = 18,Menpai = "丐帮",Kongfu = "打狗棒法",Level = 9},
new MartialArtsMaster() {Id = 2,Name = "洪七公",Age = 70,Menpai = "丐帮",Kongfu = "打狗棒法",Level = 10},
new MartialArtsMaster() {Id = 3,Name = "郭靖",Age = 22,Menpai = "丐帮",Kongfu = "降龙十八掌",Level = 10},
new MartialArtsMaster() {Id = 4,Name = "任我行",Age = 50,Menpai = "明教",Kongfu = "葵花宝典",Level = 1},
new MartialArtsMaster() {Id = 5,Name = "东方不败",Age = 35,Menpai = "明教",Kongfu = "葵花宝典",Level = 10},
new MartialArtsMaster() {Id = 6,Name = "林平之",Age = 23,Menpai = "华山",Kongfu = "葵花宝典",Level = 7},
new MartialArtsMaster() {Id = 7,Name = "岳不群",Age = 50,Menpai = "华山",Kongfu = "葵花宝典",Level = 8},
new MartialArtsMaster() {Id = 8,Name = "令狐冲",Age = 23,Menpai = "华山",Kongfu = "独孤九剑",Level = 10},
new MartialArtsMaster() {Id = 9,Name = "梅超风",Age = 23,Menpai = "梅花岛",Kongfu = "九阴真经",Level = 8},
new MartialArtsMaster() {Id = 10,Name = "黄药师",Age = 23,Menpai = "梅花岛",Kongfu = "弹指神通",Level = 10},
new MartialArtsMaster() {Id = 11,Name = "风清扬",Age = 23,Menpai = "华山",Kongfu = "独孤九剑",Level = 10}
};
//初始化武学
var kongfuList = new List<KungFu>()
{
new KungFu() {Id = 1,Name = "打狗棒法",Power = 90},
new KungFu() {Id = 2,Name = "降龙十八掌",Power = 95},
new KungFu() {Id = 3,Name = "葵花宝典",Power = 100},
new KungFu() {Id = 4,Name = "独孤九剑",Power = 100},
new KungFu() {Id = 5,Name = "九阴真经",Power = 100},
new KungFu() {Id = 6,Name = "弹指神通",Power = 100}
};
//查询所有武学大于八的武林高手,生成在一个表里
var res = new List<MartialArtsMaster>();
foreach (var item in masterList)
{
if(item.Level>8)
res.Add(item);
}
foreach (var item in res)
{
Console.WriteLine(item);
}

}
}
//output:
//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
//Id : 10,Name : "黄药师",Age : 23,Menpai : "梅花岛",Kongfu : "弹指神通",Level : 10
//Id : 11,Name : "风清扬",Age : 23,Menpai : "华山",Kongfu : "独孤九剑",Level : 10

2. linq查询:Linq to Object

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
     //使用LInq查询
var res = from m in masterList //from后面设置查询的集合
where m.Level > 8//where后面跟上查询的条件
select m.Name;//表示m的结果结合返回
foreach (var item in res)
{
Console.WriteLine(item);
}
//output:
//黄蓉
//洪七公
//郭靖
//东方不败
//令狐冲
//黄药师
//风清扬

3. Linq拓展方法查询

1
2
3
4
5
6
7
8
9
10
11
12
    //使用Linq拓展方法查询
var res2 = masterList
.Where(ml => ml.Level > 8 && ml.Menpai == "丐帮")
.Select(ml => ml.Name);
foreach (var item in res2)
{
Console.WriteLine(item);
}
//output
//黄蓉
//洪七公
//郭靖

4. LINQ集合联合查询

1
2
3
4
5
6
7
8
9
//使用Linq联合查询
var res = from m in masterList
from k in kongfuList
where k.Name == m.Kongfu
select new { master = m, kongfu = k };//使用master和kongfu作为标志生成新集合
foreach (var item in res)
{
Console.WriteLine(item);
}

结果
取得功夫杀伤力大于90的武林高手

1
2
3
4
5
6
7
8
9
//取得武学杀伤力大于90的高手
var res = from m in masterList
from k in kongfuList
where k.Name == m.Kongfu && k.Power>90
select m;
foreach (var item in res)
{
Console.WriteLine(item);
}

结果

5. LINQ使用扩展方法集合联合查询

1
2
3
4
5
6
7
8
//使用linq拓展方法联合查询
var res = masterList
.SelectMany(kl => kongfuList, (m, k) => new { master = m, KungFu = k })
.Where(x => x.master.Kongfu == x.KungFu.Name && x.KungFu.Power > 90);
foreach (var item in res)
{
Console.WriteLine(item);
}

结果
SelectMany拓展方法的第一个参数是Func<MartialArtsMaster,IEnumable<KungFu>>形参名为collectionSelector,第二个参数是Func<MartialArtsMaster,KungFu,'a>形参名为resultSelector,返回的集合相当于上面集合联合查询的第一个结果,在声明里面这个集合用'a表示
Where拓展方法的参数是Func<'a,bool>形参名为predicate返回的集合相当于上面集合联合查询的第二个结果

6. 对结果进行排序 order by descending

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    //使用linq对结果进行排序
var res = from m in masterList
where m.Level > 8 && m.Menpai == "丐帮"
//orderby m.Age 默认正序 descending时倒序
orderby m.Age descending
select m;
foreach (var item in res)
{
Console.WriteLine(item);
}
//output:
//Id: 2, Name: 洪七公, Age: 70, Menpai: 丐帮, Kongfu: 打狗棒法,Level: 10
//Id: 3, Name: 郭靖, Age: 22, Menpai: 丐帮, Kongfu: 降龙十八掌,Level: 10
//Id: 1, Name: 黄蓉, Age: 18, Menpai: 丐帮, Kongfu: 打狗棒法,Level: 9

多条件排序

1
2
3
4
5
6
7
8
9
10
11
12
                var res = from m in masterList
where m.Level > 8 && m.Menpai == "丐帮"
orderby m.Level descending , m.Age descending//先按第一个条件排序,第一个相同时按第二个排序
select m;
foreach (var item in res)
{
Console.WriteLine(item);
}
//output:
//Id: 2, Name: 洪七公, Age: 70, Menpai: 丐帮, Kongfu: 打狗棒法,Level: 10
//Id: 3, Name: 郭靖, Age: 22, Menpai: 丐帮, Kongfu: 降龙十八掌,Level: 10
//Id: 1, Name: 黄蓉, Age: 18, Menpai: 丐帮, Kongfu: 打狗棒法,Level: 9

拓展方法排序

1
2
3
4
5
6
7
8
9
//使用linq拓展方法对结果进行排序
var res = masterList
.Where(m => m.Level > 8)
.OrderByDescending(m => m.Age)
.ThenBy(m => m.Level);
foreach (var item in res)
{
Console.WriteLine(item);
}

结果

7. Join on集合联合查询

1
2
3
4
5
6
7
8
9
//使用join on联合查询
var res = from m in masterList
join k in kongfuList on m.Kongfu equals k.Name
where k.Power>90
select new { master = m, kongfu = k };
foreach (var item in res)
{
Console.WriteLine(item);
}

结果

8. 对结果进行分组操作into

1
2
3
4
5
6
7
8
9
10
//使用into 计数组
var res = from k in kongfuList
join m in masterList on k.Name equals m.Kongfu
into groups
orderby groups.Count()
select new { kongfu = k, count = groups.Count() };
foreach (var item in res)
{
Console.WriteLine(item);
}

结果

9. 对结果进行分组操作group by

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    //使用 group by自身分组
var res = from m in masterList
group m by m.Kongfu into g
orderby g.Count()
select new { kongfu = g.Key, count = g.Count() };
foreach (var item in res)
{
Console.WriteLine(item);
}
//output:
//{ count = 1, key = 降龙十八掌 }
//{ count = 1, key = 九阴真经 }
//{ count = 1, key = 弹指神通 }
//{ count = 2, key = 打狗棒法 }
//{ count = 2, key = 独孤九剑 }
//{ count = 4, key = 葵花宝典 }

10. 量词操作符 any all

1
2
3
4
5
//使用All Any返回判断
bool res1 = masterList.Any(m => m.Kongfu == "葵花宝典");
bool res2 = masterList.All(m => m.Kongfu == "葵花宝典");
Console.WriteLine(res1);//true
Console.WriteLine(res2);//false