English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
L'exécution différée signifie que l'évaluation de l'expression est différée jusqu'au moment où elle est réellement nécessaire. Elle améliore grandement les performances en évitant des exécutions inutiles.
L'exécution différée s'applique à toutes les collections en mémoire ainsi qu'aux fournisseurs LINQ distants, tels que LINQ-to-SQL, LINQ-to-Entities, LINQ-to-XML, etc.
Laissez-nous comprendre l'exécution différée à l'aide d'un exemple suivant :
Dans cet exemple, vous pouvez voir que lors de l'itération avec le foreach, la requête a été mise en œuvre et exécutée. Cela s'appelle l'exécution différée. Lorsque vous accédez réellement à chaque objet dans la collection et que vous le traitez, LINQ traite la collection studentList.
Pour vérifier si l'exécution différée retourne toujours les données les plus récentes à chaque fois, ajoutez un étudiant adolescent supplémentaire après le foreach et vérifiez la liste des étudiants adolescents :
Comme vous le voyez, le deuxième foreach itère à nouveau la requête et retourne les données les plus récentes. L'exécution différée recalcule à chaque exécution ; cela s'appelleÉvaluation paresseuse. C'est l'un des principaux avantages de l'exécution différée : elle vous fournit toujours les données les plus récentes.
Vous pouvez utiliser c# de yield La mise en œuvre de l'exécution différée pour les méthodes d'extension personnalisées avec le mot-clé IEnumerable.
Par exemple, vous pouvez réaliser une méthode d'extension personnalisée GetTeenAgerStudents pour IEnumerable, qui retourne la liste de tous les étudiants adolescents.
public static class EnumerableExtensionMethods { public static IEnumerable<Student> GetTeenAgerStudents(this IEnumerable<Student> source) { foreach (Student std in source) { Console.WriteLine("Accès à l'étudiant {0}", std.StudentName); if (std.age > 12 && std.age < 20) yield return std; } } }
Veuillez noter que chaque fois que GetTeenAgerStudents() est appelé, nous imprimons le nom des étudiants sur le console.
Maintenant, vous pouvez utiliser les méthodes d'extension suivantes :
C#:
IList<Student> studentList = new List<Student>() { new Student() { StudentID = 1, StudentName = "John", age = 13 }, new Student() { StudentID = 2, StudentName = "Steve", 15 }, new Student() { StudentID = 3, StudentName = "Bill", 18 }, new Student() { StudentID = 4, StudentName = "Ram", age = 12 }, new Student() { StudentID = 5, StudentName = "Ron", age = 21 } }; var teenAgerStudents = from s in studentList.GetTeenAgerStudents() select s; foreach (Student teenStudent in teenAgerStudents) Console.WriteLine("Nom de l'étudiant: {0}", teenStudent.StudentName);
Accès à l'étudiant John Nom de l'étudiant: John Accès à l'étudiant Steve Nom de l'étudiant: Steve Accès à l'étudiant Bill Nom de l'étudiant: Bill Accès à l'étudiant Ram Accès à l'étudiant Ron
Comme on peut le voir à l'output, GetTeenAgerStudents() est appelé lorsque vous itérez studentList avec une boucle foreach.
De cette manière, vous pouvez utiliseryieldCréez des méthodes personnalisées avec des mots-clés pour obtenir l'avantage de l'exécution en différé.