English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
为了理解为什么我们应该使用LINQ,让我们看一些示例。假设您要从一系列Student对象中查找青少年学生的列表。
在C#2.0之前,我们必须使用“ foreach”或“ for”循环遍历集合以查找特定对象。例如,我们必须编写以下代码,以从年龄在12bis20 Jahren (Jugendliche)}13bis19alle Schülerobjekte in einer Reihe von Schülern von 0 Jahren (Jugendliche) suchen:
class Student { public int StudentID { get; set; } public String StudentName { get; set; } public int Age { get; set; } } class Program { static void Main(string[] args) { Student[] studentArray = { new Student() { StudentID = 1, StudentName = "John", Age = 18 }, new Student() { StudentID = 2, StudentName = "Steve", Age = 21 }, new Student() { StudentID = 3, StudentName = "Bill", Age = 25 }, new Student() { StudentID = 4, StudentName = "Ram" , Age = 20}, new Student() { StudentID = 5, StudentName = "Ron" , Age = 31 }, new Student() { StudentID = 6, StudentName = "Chris", Age = 17 }, new Student() { StudentID = 7, StudentName = "Rob", Age = 19 }, }; Student[] students = new Student[10]; int i = 0; foreach (Student std in studentArray) { if (std.Age > 12 && std.Age < 20) { students[i] = std; i++; } } } }
Die Verwendung von for-Schleifen ist umständlich, unmaintainable und schlecht lesbar. C#20.0, um diese Situation zu behandeln, wie folgt.
Beispiel: Verwenden Sie Delegaten aus C#2im Suchen nach Elementen in einer Sammlung von Version 0.0
delegate bool FindStudent(Student std); class StudentExtension { public static Student[] where(Student[] stdArray, FindStudent del) { int i = 0; Student[] result = new Student[10]; foreach (Student std in stdArray) if (del(std)) { result[i] = std; i++; } return result; } } class Program { static void Main(string[] args) { Student[] studentArray = { new Student() { StudentID = 1, StudentName = "John", Age = 18 }; , new Student() { StudentID = 2, StudentName = "Steve", Age = 21 }; , new Student() { StudentID = 3, StudentName = "Bill", Age = 25 }; , new Student() { StudentID = 4, StudentName = "Ram" , Age = 20 } , new Student() { StudentID = 5, StudentName = "Ron" , Age = 31 }; , new Student() { StudentID = 6, StudentName = "Chris", Age = 17 }; , new Student() { StudentID = 7, StudentName = "Rob", Age = 19 }; , }; Student[] students = StudentExtension.where(studentArray, delegate(Student std) { return std.Age > 12 && std.Age < 20; }); } } }
Daher verwenden Sie C#2.0, können Sie die Vorteile der Delegierten nutzen, um Schüler zu finden, die jede Art von Bedingung erfüllen. Sie müssen nicht mit einem for-Schleifen durch verschiedene Kriterien zu findende Schüler suchen. Zum Beispiel können Sie denselben Delegierten verwenden, um Schüler mit dem StudentId5oder Schüler mit dem Namen Bill, wie folgt:
Student[] students = StudentExtension.where(studentArray, delegate(Student std) { return std.StudentID == 5; }); //Darüber hinaus verwenden Sie denselben Delegierten für andere Bedingungen Student[] students = StudentExtension.where(studentArray, delegate(Student std) { return std.StudentName == "Bill"; });
Das C#-Team glaubt, dass sie den Code immer noch weiter komprimieren und lesbarer machen müssen. Daher haben sie in C#3.0 erweiterte Methoden, Lambda-Ausdrücke, Ausdrucksbäume, anonyme Typen und Query-Expressions eingeführt. Sie können C#3.0 diese Funktionen (die Bausteine von LINQ) verwenden, um verschiedene Arten von Sammlungen abzufragen und die Ergebnisse in einer einzigen Anweisung zu erhalten.
Der folgende Beispiel zeigt, wie Sie mit LINQ-Abfragen, die Lambda-Ausdrücke verwenden, spezifische Schüler aus einer Schüler-Kollektion finden.
class Program { static void Main(string[] args) { Student[] studentArray = { new Student() { StudentID = 1, StudentName = "John", age = 18 }; , new Student() { StudentID = 2, StudentName = "Steve", age = 21 }; , new Student() { StudentID = 3, StudentName = "Bill", age = 25 }; , new Student() { StudentID = 4, StudentName = "Ram", age = 20 } , new Student() { StudentID = 5, StudentName = "Ron", age = 31 }; , new Student() { StudentID = 6, StudentName = "Chris", age = 17 }; , new Student() { StudentID = 7, StudentName = "Rob", age = 19 }; , }; // Verwenden Sie LINQ, um Jugendliche Schüler zu finden Student[] teenAgerStudents = studentArray.Where(s => s.age > 12 && s.age < 20).ToArray(); // Verwenden Sie LINQ, um den ersten Schüler mit dem Namen Bill zu finden Student bill = studentArray.Where(s => s.StudentName == "Bill").FirstOrDefault(); // 使用LINQ查找StudentID为5的学生 Student student5 = studentArray.Where(s => s.StudentID == 5).FirstOrDefault(); } }
如上例所示,我们在单个语句中使用LINQ运算符和lambda表达式指定了不同的条件。因此,LINQ使代码更紧凑且可读性强,并且还可以用于查询不同的数据源。例如,如果您在数据库中有一个学生表,而不是上面的学生对象数组,则仍可以使用相同的查询使用实体框架查找学生。
熟悉的语言(Familiar language): 开发人员不必为每种类型的数据源或数据格式学习新的查询语言。
更少的代码(Less coding): 与更传统的方法相比,它减少了要编写的代码量。
代码可读性(Readable code): LINQ使代码更具可读性,因此其他开发人员可以轻松地理解和维护它。
查询多个数据源的标准化方法(Standardized way of querying multiple data sources): 相同的LINQ语法可用于查询多个数据源。
查询的编译时安全性(Compile time safety of queries): 它在编译时提供对象的类型检查。
智能感知支持(IntelliSense Support): LINQ为通用集合提供了IntelliSense。
数据形状(Shaping data): 您可以以不同的形状检索数据。