1. 程式人生 > >LINQ用法學習(轉載)

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後面可以加descendingascending來指定是升序或者降序排列。

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 版權宣告:本文為博主原創文章,轉載請附上博文連結!