English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Отложенное выполнение означает, что оценка выражения откладывается до тех пор, пока это действительно необходимо. Это极大地提高了性能, так как avoids избыточного выполнения.
Отложенное выполнение применяется ко всем集合ам памяти и удаленным поставщикам LINQ, таким как LINQ-to-SQL, LINQ-to-Entities, LINQ-to-XML и т.д.
Давайте рассмотрим следующий пример, чтобы понять ленивое выполнение:
В примере выше вы можете увидеть, что запрос выполняется и выполняется при итерации foreach. Это называется ленивым выполнением. Когда вы фактически посещаете каждый объект в集合е и обрабатываете его, LINQ обрабатывает集合 studentList.
Чтобы проверить, всегда ли ленивое выполнение возвращает最新ные данные, добавьте еще одного подростка в цикл foreach и проверьте список студентов-подростков:
Как вы видите, второй цикл foreach снова выполняет запрос и возвращает的最新ные данные. Ленивое выполнение пересчитывается каждый раз при выполнении; это называетсяЛенивая оценка. Это один из основных преимуществ ленивого выполнения: он всегда предоставляет вам最新的 данные.
Вы можете использовать в C#: yield Реализация расширяемого метода с ключевым словом IEnumerable выполняет ленивое выполнение.
Например, вы можете реализовать пользовательский расширяемый метод GetTeenAgerStudents для IEnumerable, который вернет список всех студентов-подростков.
public static class EnumerableExtensionMethods { public static IEnumerable<Student> GetTeenAgerStudents(this IEnumerable<Student> source) { foreach (Student std in source) { Console.WriteLine("Доступ к студенту {0}", std.StudentName); if (std.age > 12 && std.age < 20) yield return std; } } }
Обратите внимание, что каждый раз, когда вызывается GetTeenAgerStudents(), мы печатаем имя студента на экране.
Теперь вы можете использовать следующие расширяемые методы:
C#:
IList<Student> studentList = new List<Student>() { new Student() { StudentID = 1, StudentName = "John", age = 13 } , new Student() { StudentID = 2, StudentName = "Steve", age = 15 } , new Student() { StudentID = 3, StudentName = "Bill", age = 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("Имя студента: {0}", teenStudent.StudentName);
Доступ к студенту John Имя студента: John Доступ к студенту Steve Имя студента: Steve Доступ к студенту Bill Имя студента: Bill Доступ к студенту Ram Доступ к студенту Ron
Как можно увидеть из вывода, при использовании цикла foreach для итерации studentList вызывается GetTeenAgerStudents().
Таким образом, вы можете использоватьyieldСоздайте пользовательские методы с помощью ключевых слов, чтобы получить преимущества задержанного выполнения.