LINQ用法學習(轉載)
語言整合查詢 (LINQ) 是一組技術的名稱,這些技術建立在將查詢功能直接整合到 C# 語言(以及 Visual Basic 和可能的任何其他 .NET 語言)的基礎上。 藉助於 LINQ,查詢現在已是高階語言構造,就如同類、方法、事件等等。
對於編寫查詢的開發人員來說,LINQ 最明顯的“語言整合”部分是查詢表示式。 查詢表示式是使用 C# 3.0 中引入的宣告性查詢語法編寫的。 通過使用查詢語法,您甚至可以使用最少的程式碼對資料來源執行復雜的篩選、排序和分組操作。 您使用相同的基本查詢表示式模式來查詢和轉換 SQL 資料庫、ADO.NET 資料集、XML 文件和流以及 .NET 集合中的資料。
一個簡單的例子
查詢陣列中的偶數,即num % 2 == 0
,使用以下程式碼。
第二種方法使用lamda表示式,不知道的可以先忽略。
int[] numbers = { 5, 10, 8, 3, 6, 12 }; //1. Query syntax var numQuery1 = from num in numbers where num % 2 == 0 orderby num select num; //2. Method syntax var numQuerry2 = numbers.Where(num => num%2 == 0).OrderBy(num => num); foreach (var i in numQuery1) { Console.Write("{0} ",i); } Console.WriteLine(" "); foreach (var b in numQuerry2) { Console.Write("{0} ",b); } Console.ReadLine();
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
執行結果如圖所示orderby
後面可以加descending
和ascending
來指定是升序或者降序排列。
group分組的使用
增加如下類定義
class Student { public int ID { get; set; } public string Name { get; set; } public int Class { get; set; } }
- 1
- 2
- 3
- 4
- 5
- 6
LINQ語句如下
List<Student> students = new List<Student>();
students.Add(new Student() {ID = 001,Name = "ZhangSan",Class = 1});
students.Add(new Student() {ID = 002,Name = "LiSiYu",Class = 4});
students.Add(new Student() {ID = 007,Name = "LaoWang",Class = 4});
students.Add(new Student() {ID = 010,Name = "ZhaoSi",Class = 2});
var studentsClass = from stu in students
group stu by stu.Class;
foreach (var c in studentsClass)
{
Console.WriteLine("Class {0}",c.Key);
foreach (var student in c)
{
Console.WriteLine(" {0} {1}",student.ID,student.Name);
}
}
Console.ReadLine();
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
執行結果如下圖
可見studentsClass
是按照班級分組後的結果。
Join的使用
在上面的基礎上增加類
class StudentHome
{
public string Name { get; set; }
public string Hometown { get; set; }
}
- 1
- 2
- 3
- 4
- 5
主函式部分如下
List<Student> students = new List<Student>();
students.Add(new Student() {ID = 001,Name = "ZhangSan",Class = 1});
students.Add(new Student() {ID = 002,Name = "LiSiYu",Class = 4});
students.Add(new Student() {ID = 007,Name = "LaoWang",Class = 4});
students.Add(new Student() {ID = 010,Name = "ZhaoSi",Class = 2});
List<StudentHome> studentHomes = new List<StudentHome>();
studentHomes.Add(new StudentHome() {Name = "LiSiYu",Hometown = "JiangSu"});
studentHomes.Add(new StudentHome() {Name = "LaoWang", Hometown = "HeBei"});
studentHomes.Add(new StudentHome() {Name = "WangWu",Hometown = "XinJiang"});
var studentsInfo = from student in students
join studentHome in studentHomes on student.Name equals studentHome.Name
select new {Name = student.Name, ID = student.ID, Hometown = studentHome.Hometown};
foreach (var studentInfo in studentsInfo)
{
Console.WriteLine("{0} {1} {2}", studentInfo.ID, studentInfo.Name, studentInfo.Hometown);
}
Console.ReadLine();
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
輸出結果如下
可見linq類似於SQL語句中的join,將兩個列表連線起來。on student.Name equals studentHome.Name
指定了兩個列表的連線條件,select new {Name = student.Name, ID = student.ID, Hometown = studentHome.Hometown}
建立了一個新型別。
into的使用
into
可以將group
的結果暫時打包,後面的語句中可以使用該集合查詢。例如下面的例子
var students = new List<Student>();
students.Add(new Student {ID = 001, Name = "ZhangSan", Class = 1});
students.Add(new Student {ID = 002, Name = "LiSiYu", Class = 4});
students.Add(new Student {ID = 007, Name = "LaoWang", Class = 4});
students.Add(new Student {ID = 010, Name = "ZhaoSi", Class = 2});
var studentsClass = from stu in students
group stu by stu.Class into stuClass
where stuClass.Count() >= 2
select new {Class = stuClass.Key, Number = stuClass.Count()};
foreach (var s in studentsClass)
{
Console.WriteLine("Class:{0} Number{1}", s.Class, s.Number);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
這段程式就將分組的得到的結果存入stuClass
中,選擇人數大於2的班級,建立一個包含班級名和人數的匿名型別。程式執行結果如下。
let的使用
let
相當於暫時定義一個變數,供後面查詢使用,比如下面的程式碼
var studentHomes = new List<StudentHome>();
studentHomes.Add(new StudentHome {Name = "LiSiYu", Hometown = "JiangSu"});
studentHomes.Add(new StudentHome {Name = "LaoWang", Hometown = "HeBei"});
studentHomes.Add(new StudentHome {Name = "WangWu", Hometown = "XinJiang"});
var hometowns = from home in studentHomes
let BigHome = home.Hometown.ToUpper()
select BigHome;
foreach (var hometown in hometowns)
{
Console.WriteLine(hometown);
}
Console.ReadLine();
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
這裡使用let
將家鄉的大寫定義為了BigHome
,這裡也可以執行其他的複雜函式,程式執行結果如下
以上。
--------------------- 作者:zhaozhaozzz 來源:CSDN 原文:https://blog.csdn.net/wawawa8/article/details/51542135?utm_source=copy 版權宣告:本文為博主原創文章,轉載請附上博文連結!