文章目录
一、查询过滤:where()
where() 的参数是用于过滤的条件,要求条件必须返回bool
例:
var news = new[] {
new {Name="张三",Age=19,Address="北京" },
new {Name="李四",Age=22,Address="上海" },
new {Name="王五",Age=34,Address="广州" },
new {Name="赵六",Age=45,Address="杭州" },
new {Name="孙琦",Age=25,Address="深圳" },
new {Name="钱玖",Age=45,Address="成都" },
};
var list1 = news.Where(i=>i.Age>20 && i.Address=="深圳");
foreach (var item in list1)
{
Console.WriteLine("Name:{0},Age:{1},Address:{2}",item.Name,item.Age,item.Address);
}
结果:
Name:孙琦,Age:25,Address:深圳
- 1
二、选取数据:Select()、SelectMany()
1.select()*
返回一个对象,对数据进行选取或重新组装
例:
var news = new[] {
new {Name="张三",Age=19,Address="北京" },
new {Name="李四",Age=22,Address="上海" },
new {Name="王五",Age=34,Address="广州" },
new {Name="赵六",Age=45,Address="杭州" },
new {Name="孙琦",Age=25,Address="深圳" },
new {Name="钱玖",Age=45,Address="成都" },
};
var list1 = news.Select(i=>new {name=i.Name,age=i.Age });
foreach (var item in list1)
{
Console.WriteLine("Name:{0},Age:{1}", item.name, item.age);
}
结果:
Name:张三,Age:19
Name:李四,Age:22
Name:王五,Age:34
Name:赵六,Age:45
Name:孙琦,Age:25
Name:钱玖,Age:45
2. SelectMany()
类似于数据库的CROSS JOIN ,参考以下例子
例:
List<int> list1 = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
List<int> list2 = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var query = list1.SelectMany(i => list2, (x, y) => new { result = "" + y + "*" + x + "=" + x * y + "" });
string str = string.Empty;
foreach (var item in query)
{
if (item.result == "9*1=9" || item.result == "9*2=18" ||
item.result == "9*3=27" || item.result == "9*4=36" ||
item.result == "9*5=45" || item.result == "9*6=54" ||
item.result == "9*7=63" || item.result == "9*8=72")
{
str +=item.result+"\n";
}
else
{
str += item.result + "\t";
}
}
string[] array = str.Split('\n');
for (int i = 0; i < array.Length; i++)
{
if (i < 3)
{ array[i] = array[i].Substring(0, ((i + 1) * 6)); }
else if (i > 3)
{ array[i] = array[i].Substring(0, ((i + 1) * 6 + i)); }
else
{ array[i] = array[i].Substring(0, ((i + 1) * 6 +2)); }
Console.WriteLine(array[i]);
}
结果:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
三、联接查询:Join()、GroupJoin()
1.Join()
数据1.Join(数据2,数据1.key,数据2.key,查询结果)
例:
var list1 = new[] {
new {id=1,Name="Jack"},
new {id=2,Name="Wiseman" },
new {id=3,Name="Witt"},
new {id=4,Name="Wolf" }
};
var list2 = new[] {
new { id=2,Name="Woodrow"},
new {id=3,Name="Wooten" },
new {id=5,Name="Hays" },
new {id=8,Name="Hayley" }
};
var query = list1.Join(list2, item1 => item1.id, item2 => item2.id, (item1, item2) => new { item1, item2 });
foreach (var item in query)
{
Console.WriteLine("List1----ID:{0},Name:{1}", item.item1.id, item.item1.Name);
Console.WriteLine("List2----ID:{0},Name:{1}\n", item.item1.id, item.item2.Name);
}
结果:
List1----ID:2,Name:Wiseman
List2----ID:2,Name:Woodrow
List1----ID:3,Name:Witt
List2----ID:3,Name:Wooten
GroupJoin()
同上,返回数据1的所有元素和根据数据1的key获取的数据2的元素集合,具体请参考以下例子
例:
var list1 = new[] {
new {ID=1,Name="张老师" },
new {ID=2,Name="李老师" },
new {ID=3,Name="周老师" },
new {ID=4,Name="王老师" }
};
var list2 = new[] {
new {ID=1,Subject="C#" },
new {ID=2,Subject="Java" },
new {ID=3,Subject="lua" },
new {ID=1,Subject="javacirpt" },
new {ID=2,Subject="C" },
new {ID=4,Subject="C++" },
new {ID=5,Subject="python" },
new {ID=4,Subject="php" },
new {ID=6,Subject="html" }
};
Console.WriteLine("-------查询所有老师教的课程-------\n\n");
var query = list1.GroupJoin(list2,item1=>item1.ID,item2=>item2.ID,(item1,item2)=>new {item1,item2});
foreach (var item in query)
{
Console.WriteLine("{0}教{1}门课程,其中有{2}\n",item.item1.Name,item.item2.Count(),
string.Join("、",item.item2.Select(i=>i.Subject)));
}
//或者这样写,结果一样:
Console.WriteLine("--------------------------\n");
var query2 = list1.GroupJoin(list2, item1 => item1.ID, item2 => item2.ID, (item1, item2) =>
new { t = item1.Name, c = item2.Count(), s = string.Join("、", item2.Select(i => i.Subject)) });
foreach (var item in query2)
{
Console.WriteLine("{0}教{1}门课程,其中有{2}\n", item.t, item.c, item.s);
}
Console.WriteLine("\n-------查询没有老师教的课程-------\n\n");
var query3 = list2.GroupJoin(list1, item2 => item2.ID, item1 => item1.ID,
(item2, item1) => new {s=item1.Count()==0?item2.Subject:null});
string str = string.Empty;
foreach (var item in query3)
{
if (item.s != null)
{
str += item.s + ",";
}
}
Console.WriteLine("目前没有老师教的课程有:{0}\n\n",str.Substring(0,str.Length-1));
结果:
-------查询所有老师教的课程-------
张老师教2门课程,其中有C#、javacirpt
李老师教2门课程,其中有Java、C
周老师教1门课程,其中有lua
王老师教2门课程,其中有C++、php
--------------------------
张老师教2门课程,其中有C#、javacirpt
李老师教2门课程,其中有Java、C
周老师教1门课程,其中有lua
王老师教2门课程,其中有C++、php
-------查询没有老师教的课程-------
目前没有老师教的课程有:python,html
四、分组查询:GroupBy()、ToLookup()
都是根据传入的参数对key进行分组,区别在于GroupBy() 是延迟查询,ToLookup() 不是。
1.GroupBy() 延迟加载
例:
var news = new[] {
new {Name="张三",Age=19,Address="上海" },
new {Name="李四",Age=22,Address="上海" },
new {Name="王五",Age=34,Address="广州" },
new {Name="赵六",Age=45,Address="广州" },
new {Name="孙琦",Age=25,Address="深圳" },
new {Name="钱玖",Age=45,Address="深圳" },
new {Name="黄菲",Age=45,Address="北京" }
};
var list1 = news.GroupBy(i=>i.Address);
//修改数组最后一条数据
news[6] = new { Name = "黄菲", Age = 45, Address = "上海" };
var list2 = news.GroupBy(i => i.Address);
Console.WriteLine("-----------list1-----------\n\n");
foreach (var item in list1)
{
Console.WriteLine("\n---------Address:{0}---------\n", item.Key);
foreach (var item1 in item)
{
Console.WriteLine("Name:{0},Age:{1}", item1.Name, item1.Age);
}
}
Console.WriteLine("\n\n-----------list2-----------\n\n");
foreach (var item in list2)
{
Console.WriteLine("\n---------Address:{0}---------\n", item.Key);
foreach (var item1 in item)
{
Console.WriteLine("Name:{0},Age:{1}", item1.Name, item1.Age);
}
}
结果:
---------------list1---------------
---------Address:上海---------
Name:张三,Age:19
Name:李四,Age:22
Name:黄菲,Age:45
---------Address:广州---------
Name:王五,Age:34
Name:赵六,Age:45
---------Address:深圳---------
Name:孙琦,Age:25
Name:钱玖,Age:45
---------------list2---------------
---------Address:上海---------
Name:张三,Age:19
Name:李四,Age:22
Name:黄菲,Age:45
---------Address:广州---------
Name:王五,Age:34
Name:赵六,Age:45
---------Address:深圳---------
Name:孙琦,Age:25
Name:钱玖,Age:45
2.ToLookUp()立即加载
例:
将上面代码中的GroupBy 改为 ToLookup
结果:
---------------list1---------------
---------Address:上海---------
Name:张三,Age:19
Name:李四,Age:22
---------Address:广州---------
Name:王五,Age:34
Name:赵六,Age:45
---------Address:深圳---------
Name:孙琦,Age:25
Name:钱玖,Age:45
---------Address:北京---------
Name:黄菲,Age:45
---------------list2---------------
---------Address:上海---------
Name:张三,Age:19
Name:李四,Age:22
Name:黄菲,Age:45
---------Address:广州---------
Name:王五,Age:34
Name:赵六,Age:45
---------Address:深圳---------
Name:孙琦,Age:25
Name:钱玖,Age:45
五、数据排序:OrderBy()、OrderByDescending()、ThenBy()、THenByDescending()
OrderBy():
根据传入参数对数据源排序(升序)
OrderByDescending():
与Orderby() 相同,做反向排序(降序)
ThenBy():
用于多重排序,与OrderBy() 组合,使用于OrderBy() 之后。
THenByDescending():
同上
例:
var list2 = new[] {
new {ID=1,Subject="C#" },
new {ID=2,Subject="Java" },
new {ID=3,Subject="lua" },
new {ID=1,Subject="javacirpt" },
new {ID=2,Subject="C" },
new {ID=4,Subject="C++" },
new {ID=5,Subject="python" },
new {ID=4,Subject="php" },
new {ID=6,Subject="html" }
};
Console.WriteLine("---------Orderby()、ThenBy()---------\n\n");
var query4 =list2.OrderBy(i=>i.ID).ThenBy(i=>i.Subject);
foreach (var item in query4)
{
Console.WriteLine(item);
}
Console.WriteLine("\n\n---------OrderByDescending()、ThenByDescending()---------\n\n");
var query5 = list2.OrderByDescending(i => i.ID).ThenByDescending(i => i.Subject);
foreach (var item in query5)
{
Console.WriteLine(item);
}
结果:
---------Orderby()、ThenBy()---------
{ ID = 1, Subject = C# }
{ ID = 1, Subject = javacirpt }
{ ID = 2, Subject = C }
{ ID = 2, Subject = Java }
{ ID = 3, Subject = lua }
{ ID = 4, Subject = C++ }
{ ID = 4, Subject = php }
{ ID = 5, Subject = python }
{ ID = 6, Subject = html }
---------OrderByDescending()、ThenByDescending()---------
{ ID = 6, Subject = html }
{ ID = 5, Subject = python }
{ ID = 4, Subject = php }
{ ID = 4, Subject = C++ }
{ ID = 3, Subject = lua }
{ ID = 2, Subject = Java }
{ ID = 2, Subject = C }
{ ID = 1, Subject = javacirpt }
{ ID = 1, Subject = C# }
六、集合划分:Take()、Skip()、TakeWhile()、SkipWhile()
Skip():
跳过指定的元素数量,返回剩余元素
例:
var list = new[] { 1,2,3,4,5,6,7,8};
var query = list.Skip(2);
Console.WriteLine("-------------Skip-------------");
foreach (var item in query)
{
Console.WriteLine(item);
}
结果:
-------------Skip-------------
3
4
5
6
7
8
SkipWhile():
跳过满足条件的元素,返回剩余元素
注:当第一次检测到条件为false时,将不在检测,直接返回剩余所有元素
例:
var list = new[] { 1,2,3,4,5,6,7,8};
Console.WriteLine("-------------SkipWhile>>1-------------");
var query2 = list.SkipWhile(x => x <= 5);
foreach (var item in query2)
{
Console.WriteLine(item);
}
//1==5 为false(不满足条件),将返回1(包括1)后面的所有元素
Console.WriteLine("-------------SkipWhile>>2-------------");
var query5 = list.SkipWhile(x => x >= 5);
foreach (var item in query5)
{
Console.WriteLine(item);
}
结果:
-------------SkipWhile>>1-------------
6
7
8
-------------SkipWhile>>2-------------
1
2
3
4
5
6
7
8
Take():
返回指定数量的元素
例:
var list = new[] { 1,2,3,4,5,6,7,8};
var query = list.Take(5);
Console.WriteLine("-------------Take-------------");
foreach (var item in query)
{
Console.WriteLine(item);
}
结果:
-------------Take-------------
1
2
3
4
5
TakeWhile():
返回满足条件的所有元素
注:当第一次检测到条件为false时,将不在检测,返回满足条件的元素
例1:
var list = new[] { 1,2,3,4,5,6,7,8};
//由于 1>2 为false(不满足条件),所以1 (包括1)后面的所有元素都不会返回
var query = list.TakeWhile(i=>i>2);
Console.WriteLine("-------------TakeWhile-------------");
foreach (var item in query)
{
Console.WriteLine(item);
}
结果:
-------------TakeWhile-------------
例2:
利用 Skip() 和 TakeWhile() 做一个简单的分页*
var list2 = new[]{
new { iD=1,Str="数据1"},new { iD=2,Str="数据2"},new { iD=3,Str="数据3"},
new { iD=4,Str="数据4"},new { iD=5,Str="数据5"},new { iD=6,Str="数据6"},
new { iD=7,Str="数据7"},new { iD=8,Str="数据8"},new { iD=9,Str="数据9"},
new { iD=10,Str="数据10"},new { iD=11,Str="数据11"},new { iD=12,Str="数据12"},
new { iD=13,Str="数据13"},new { iD=14,Str="数据14"},new { iD=15,Str="数据15"},
new { iD=16,Str="数据16"},new { iD=17,Str="数据17"},new { iD=18,Str="数据18"}
};
Console.WriteLine();
Console.WriteLine("----------------使用Skip()和TakeWhile()进行分页查询----------------\n\n\n");
int sum = 0;//每页显示数量
int page = 1;//当前页数
Console.WriteLine("开始查詢数据,按任意键继续,按Q退出\n");
while (Console.ReadLine().ToLower() != "q")
{
tag1:
Console.WriteLine("\n输入每页显示数量:\t");
try
{
sum = int.Parse(Console.ReadLine());
if (sum <= 0)
{
Console.WriteLine("\n每页显示数量不得小于1!");
goto tag1;
}
}
catch (Exception)
{
Console.WriteLine("\n输入数量有误,请重新输入!");
goto tag1;
}
int pageCount = list2.Length % sum == 0 ? (list2.Length / sum) : ((list2.Length / sum) + 1);
tag2:
Console.WriteLine("\n当前共" + pageCount + "页,输入跳转页数:\t");
try
{
page = int.Parse(Console.ReadLine());
if (sum <= 0)
{
Console.WriteLine("\n页数必须大于0!!");
goto tag2;
}
}
catch (Exception)
{
Console.WriteLine("\n输入页数有误,请重新输入!");
goto tag2;
}
if (page > pageCount)
{
Console.WriteLine("\n输入頁数超过总页数,將为你显示最后一页!");
page = pageCount;
}
if (page < 1)
{
Console.WriteLine("\n输入頁面小于1,將为你显示第一页!");
page = 1;
}
var query4 = list2.Skip(sum * (page - 1)).TakeWhile(i => i.iD <= sum * page);
foreach (var item in query4)
{
Console.WriteLine("ID:{0},\tstr:{1}", item.iD, item.Str);
}
Console.WriteLine("\n\n开始查询数据,按任意键继续,按Q退出!");
}
结果:
----------------使用Skip()和TakeWhile()進行分頁查詢----------------
开始查询数据,按任意键继续,按Q退出
f
输入每页显示数量: f
输入数量有误,请重新输入!
输入每页显示数量: -5
每页显示数量不得小于1!
输入每页显示数量: 5
当前共4页,输入跳转页数: f
输入頁面有误,请重新输入!
当前共4页,輸入跳转页数: -2
输入页数小于1,将为你显示第一页!
ID:1, str:数据1
ID:2, str:数据2
ID:3, str:数据3
ID:4, str:数据4
ID:5, str:数据5
开始查询数据,按任意键继续,按Q退出!
f
输入每页显示数量: 4
当前共5页,輸入跳转页数: 23
输入页数超过总页数,将为你显示最后一页!
ID:17, str:数据17
ID:18, str:数据18
开始查询数据,按任意键继续,按Q退出!
Q
Press any key to continue . . .
七、集合运算:Union()、Intersect()、Except()
Union():
返回两个集合中的并集(两集合重复元素只保留一个)
例:
int [] array1 = new int[] {1,3,5,2,8,7,9 };
int [] array2 = new int[] { 1,4,8,6,3,2 };
var result=array1.Union(array2);
Console.WriteLine("----------Union----------\n");
foreach (var item in result)
{
Console.Write(item+"\t");
}
结果:
----------Union----------
1 3 5 2 8 7 9 4 6
若要合并自定义数据类型对象集合,则需要实现 IEqualityComparer< T > 泛型接口
参考以下实例
class News
{
public int ID { get; set; }
public string Name { get; set; }
}
class NewsComparer : IEqualityComparer<News>
{
public bool Equals(News new1, News new2)
{
if (ReferenceEquals(new1, new2)) return true;
return new1 != null && new2 != null &&
new1.ID.Equals(new2.ID) && new1.Name.Equals(new2.Name);
}
public int GetHashCode(News news)
{
int HashName = news.Name == null ? 0 : news.Name.GetHashCode();
int HashID = news.ID.GetHashCode();
return HashName ^ HashID;
}
}
//-------------------------main方法----------------------
List<News> list1 = new List<News>() {
new News() {ID=1,Name="张三" },
new News() {ID=2,Name="李四" },
new News() {ID=3,Name="王五" }
};
List<News> list2 = new List<News>() {
new News() {ID=4,Name="李玖" },
new News() {ID=2,Name="李四" },
new News() {ID=3,Name="王五" }
};
var query = list1.Union(list2,new NewsComparer());
foreach (var item in query)
{
Console.WriteLine("ID:{0},\tName:{1}",item.ID,item.Name);
}
结果:
ID:1, Name:张三
ID:2, Name:李四
ID:3, Name:王五
ID:4, Name:李玖
Intersect():
返回两个集合的交集
例:
int [] array1 = new int[] {1,3,5,2,8,7,9 };
int [] array2 = new int[] { 1,4,8,6,3,2 };
var result=array1.Intersect(array2);
Console.WriteLine("----------Inersect----------\n");
foreach (var item in result)
{
Console.Write(item+"\t");
}
结果:
----------Inersect----------
1 3 2 8
获取自定义数据类型对象集合的交集,参考 Union() 的例子
Except():
返回两个集合的差集
例:
int[] array1 = new int[] { 1, 3, 5, 2, 8, 7, 9 };
int[] array2 = new int[] { 1, 4, 8, 6, 3, 2 };
var result = array1.Except(array2);
Console.WriteLine("----------Inersect----------\n");
结果:
----------Inersect----------
5 7 9
获取自定义数据类型对象集合的差集,参考 Union() 的例子
Distinct():
返回集合中非重复的元素
例1:
int[] int1 = new int[] { 1, 2, 1, 3, 4, 4, 3, 2, 5, 6 };
var list4 = int1.Distinct();
foreach (var item in list4)
{
Console.Write(item+"\t");
}
结果:
1 2 3 4 5 6
对自定义数据类型对象集合去重,需要实现 IEquatable< T > 泛型接口
参考以下实例
例2:
class News : IEquatable<News>
{
public int ID { get; set; }
public string Name { get; set; }
public bool Equals(News news)
{
if (ReferenceEquals(news, null)) return false;
if (ReferenceEquals(this, news)) return true;
return ID.Equals(news.ID) && Name.Equals(news.Name);
}
public override int GetHashCode()
{
int HashName = Name == null ? 0 : Name.GetHashCode();
int HashID = ID.GetHashCode();
return HashName ^ HashID;
}
}
//-----------------------------------------Mian函数-----------------------------------------
List<News> list1 = new List<News>() {
new News() {ID=1,Name="张三" },
new News() {ID=2,Name="李四" },
new News() {ID=3,Name="王五" },
new News() {ID=2,Name="李四" },
new News() {ID=3,Name="王五" }
};
var query = list1.Distinct();
foreach (var item in query)
{
Console.WriteLine("ID:{0}\tName:{1}",item.ID,item.Name);
}
结果:
ID:1 Name:张三
ID:2 Name:李四
ID:3 Name:王五
八、汇总聚合:Average()、Max()、Min()、Sum()、Aggregate()、Zip()
Average():
计算集合的平均值
只支持int 、long、double、single、deciaml 等值类型
Max():
返回集合中的最大值
支持类型同上
Min():
返回集合中的最小值
支持类型同上
Sum():
计算集合的和
支持类型同上
例:
int [] list = new [] {4,5,6,14,3,10 };
Console.WriteLine("平均值为:{0}\n\n",list.Average());
Console.WriteLine("最大值为:{0}\n\n", list.Max());
Console.WriteLine("最小值为:{0}\n\n", list.Min());
Console.WriteLine("总和为:{0}\n\n", list.Sum());
结果:
平均值为:7
最大值为:14
最小值为:3
总和为:42
Aggregate():
1.按照传入的条件对元素进行累计运算
2.可传入种子值作为累计计算的初始值,对返回结果进行处理
参考以下两个实例:
例1:
//按照字符串长度排序输出
List<string> list = new List<string>() { "red", "yellow", "green", "blue", "paleturquoise", "papayawhip", "peachpuff" };
int count = list.Count;
for (int i = 0; i < count; i++)
{
string a = list.Aggregate((x, y) => x.Length > y.Length ? x : y);
list.Remove(a);
Console.WriteLine(a + "\n");
}
paleturquoise
papayawhip
peachpuff
yellow
green
blue
red
例2:
//用输入的数对数组依次相减,若结果为 小于0 则 返回 0;
while (true)
{
int[] list = new int[] { 81, 55, 22, 7, 12, 18, 20 };
tag:
Console.WriteLine("\n请输入一個数字,输入Q退出:\n");
int a = 0;
dynamic d = Console.ReadLine();
if (d == "q" || d == "Q")
{
break;
}
try
{
a = int.Parse(d);
}
catch (Exception)
{
Console.WriteLine("\n请输入有效数字!");
goto tag;
}
int ret = list.Aggregate(a, (x, y) => x - y, (result) => result <= 0 ? 0 : result);
Console.WriteLine("\n结果为:" + ret+"");
}
结果:
请输入一个数字,输入Q退出:
200
结果为:0
请输入一个数字,输入Q退出:
300
结果为:85
请输入一个数字,输入Q退出:
q
Press any key to continue . . .
Zip():
对两个集合中元素进行合并,若两集合元素数量不一致,则返回结果元素数量与元素数量少的一致(即:一个集合是4个元素,一个是3个,返回结果元素是3个)
参考以下例子
例:
List<int> list1 = new List<int> { 19, 20, 34, 42, 22, 14, 25 };
List<string> list2 = new List<string> {"张三","李四","王五","赵二","牛六","周玖"};
var result = list1.Zip(list2, (x, y) => string.Format("{0}今年{1}岁了",y,x));
foreach (var item in result)
{
Console.WriteLine(item);
}
结果:
張三今年19岁了 李四今年20岁了 王五今年34岁了 趙二今年42岁了 牛六今年22岁了 周玖今年14岁了
版权声明:本文为译文,请尊重原作者,转载请保留原文链接:https://blog.csdn.net/minyi0703/article/details/82789051
注意:本文归作者所有,未经作者允许,不得转载