English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
为了理解为什么我们应该使用LINQ,让我们看一些示例。假设您要从一系列Student对象中查找青少年学生的列表。
在C#2.0之前,我们必须使用“ foreach”或“ for”循环遍历集合以查找特定对象。例如,我们必须编写以下代码,以从年龄在12à20 ans (adolescents)}}13à19chercher tous les objets Student dans une série d'élèves de
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++; } } } }
L'utilisation de la boucle for est ennuyeuse, difficile à maintenir et a une mauvaise lisibilité. C#20.0 avec des délégués, qui peuvent être utilisés pour traiter ce type de situation, comme suit.
Exemple : utiliser le delegate à partir de C#2dans la collection de 0.0 pour trouver un élément
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; }); } } }
Ainsi, en utilisant C#2.0, vous pouvez utiliser l'avantage des délégués pour trouver des étudiants correspondant à n'importe quelle condition. Vous n'avez pas besoin d'utiliser une boucle for pour trouver des étudiants utilisant différents critères. Par exemple, vous pouvez utiliser la même fonction de délégué pour trouver un StudentId de5ou un étudiant dont le nom est Bill, comme suit :
Student[] students = StudentExtension.where(studentArray, delegate(Student std) { return std.StudentID == 5; }); //De plus, utilisez le même délégué pour d'autres conditions Student[] students = StudentExtension.where(studentArray, delegate(Student std) { return std.StudentName == "Bill"; });
L'équipe C# pense qu'ils doivent encore rendre le code plus compact et plus lisible. Par conséquent, ils ont introduit dans C#3.0, des méthodes d'extension, des expressions lambda, des arbres d'expressions et des types anonymes, et vous pouvez utiliser C#3.0 de ces fonctionnalités (elles sont les éléments constitutifs de LINQ) pour interroger différents types de collections et obtenir des éléments de résultats dans une seule instruction.
L'exemple suivant montre comment utiliser une requête LINQ avec une expression lambda pour trouver un étudiant spécifique dans une collection d'étudiants.
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 }; , }; // Utiliser LINQ pour trouver les étudiants adolescents Student[] teenAgerStudents = studentArray.Where(s => s.age > 12 && s.age < 20).ToArray(); // Utiliser LINQ pour trouver le premier étudiant dont le nom est Bill Student bill = studentArray.Where(s => s.StudentName == "Bill").FirstOrDefault(); // Recherchez l'ID étudiant en utilisant LINQ5de l'étudiant Student student5 = studentArray.Where(s => s.StudentID == 5).FirstOrDefault(); } }
Comme dans l'exemple ci-dessus, nous utilisons des opérateurs LINQ et des expressions lambda pour spécifier différentes conditions dans une seule instruction. Par conséquent, LINQ rend le code plus compact et plus lisible, et peut également être utilisé pour interroger différentes sources de données. Par exemple, si vous avez une table d'étudiants dans une base de données, au lieu de l'array d'objets d'étudiants ci-dessus, vous pouvez toujours utiliser la même requête pour trouver des étudiants en utilisant Entity Framework.
Langage familier (Familiar language): Les développeurs n'ont pas besoin d'apprendre un nouveau langage de requête pour chaque type de source de données ou format de données.
Moins de codage (Less coding): Par rapport aux méthodes plus traditionnelles, il réduit la quantité de code à écrire.
Lisibilité du code (Readable code): LINQ rend le code plus lisible, ce qui permet à d'autres développeurs de le comprendre et de le maintenir facilement.
Méthode standardisée pour interroger plusieurs sources de données (Standardized way of querying multiple data sources): La même syntaxe LINQ peut être utilisée pour interroger plusieurs sources de données.
Sécurité des requêtes au moment de la compilation (Compile time safety of queries): Il fournit des vérifications de types d'objets au moment de la compilation.
Support IntelliSense (IntelliSense Support): LINQ fournit IntelliSense pour les collections génériques.
Forme des données (Shaping data): Vous pouvez rechercher des données sous différentes formes.